Прочитать на английском

Поделиться через


IntPtr.Zero Поле

Определение

Доступное только для чтения поле, представляющее целое число со знаком, инициализированное нулевым значением.

public static readonly IntPtr Zero;

Значение поля

IntPtr

Комментарии

Значение этого поля не эквивалентно null. Используйте это поле, чтобы эффективно определить, задано ли для экземпляра IntPtr значение, отличное от нуля.

Например, предположим, что переменная ip является экземпляром IntPtr. Вы можете определить, задано ли оно, сравнив его со значением, возвращенным конструктором, например: " if ip != new IntPtr(0)... ". Однако вызов конструктора для получения неинициализированного указателя неэффективен. Лучше закодировать либо " if ip != IntPtr.Zero... , либо " ". if !IntPtr.Zero.Equals(ip)...

При вызове API Windows из управляемого null кода можно передать IntPtr.Zero вместо , если аргумент должен быть указателем или null. Например, следующий вызов функции Windows CreateFile предоставляет IntPtr.Zero значения аргументов pSecurityAttributes и hTemplateFile .

using Microsoft.Win32.SafeHandles;
using System;
using System.Runtime.InteropServices;

public class Example
{
   private const uint GENERIC_READ = 0x80000000;
   private const uint OPEN_EXISTING = 3;
   private const uint FILE_ATTRIBUTE_NORMAL = 128;
   private const uint FILE_FLAG_OVERLAPPED = 0x40000000;

   [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
   private static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(
            string lpFileName, System.UInt32 dwDesiredAccess, System.UInt32 dwShareMode,
            IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition,
            System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);

   public static void Main()
   {
      SafeFileHandle hnd = CreateFile("CallOfTheWild.txt", GENERIC_READ, 0,
                                      IntPtr.Zero, OPEN_EXISTING,
                                      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                                      IntPtr.Zero);
      if (hnd.IsInvalid) {
            Exception ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
            Console.WriteLine("Attempt to open file failed:");
            Console.WriteLine("  {0}", ex.Message);
            return;
      }
      else {
         Console.WriteLine("File successfully opened.");
         hnd.Close();
      }
   }
}
// If the file cannot be found, the example displays the following output:
//    Attempt to open file failed:
//      The system cannot find the file specified. (Exception from HRESULT: 0x80070002)

Примечание

Хотя Zero эквивалентно null для функций API Windows с параметрами или возвращаемыми значениями, которые могут быть указателями или null, Zero не эквивалентно null. Передача null в IntPtr.Zero.Equals метод всегда возвращает .false

Можно также проверить возвращаемое null значение из вызовов функций API Windows, возвращающих указатель или , null сравнив возвращаемое значение с IntPtr.Zero. Например, вызов GetWindow функции в следующем примере пытается получить дескриптор несуществующего окна. Если бы он был вызван из неуправляемого кода, функция возвращала nullбы , но при вызове из управляемого кода она возвращает IntPtr.Zero.

using System;
using System.Runtime.InteropServices;

public class Example
{
   private const int GW_OWNER = 4;

   [DllImport("user32", CharSet=CharSet.Auto, SetLastError=true, ExactSpelling=true)]
   public static extern IntPtr GetWindow(IntPtr hwnd, int wFlag);

   public static void Main()
   {
      IntPtr hwnd = new IntPtr(3);
      IntPtr hOwner = GetWindow(hwnd, GW_OWNER);
      if (hOwner == IntPtr.Zero)
         Console.WriteLine("Window not found.");
   }
}
// The example displays the following output:
//        Window not found.

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0