Auf Englisch lesen

Freigeben über


IntPtr.Zero Feld

Definition

Ein schreibgeschütztes Feld, das eine ganzzahlige Vorzeichen darstellt, die mit null initialisiert wurde.

public static readonly IntPtr Zero;

Feldwert

IntPtr

Hinweise

Der Wert dieses Felds entspricht nicht .null Verwenden Sie dieses Feld, um effizient zu bestimmen, ob ein instance von IntPtr auf einen anderen Wert als 0 festgelegt wurde.

Angenommen, die Variable ip ist eine instance von IntPtr. Sie können ermitteln, ob sie festgelegt wurde, indem Sie ihn mit dem von einem Konstruktor zurückgegebenen Wert vergleichen, z. B. " if ip != new IntPtr(0)... ". Das Aufrufen eines Konstruktors zum Abrufen eines nicht initialisierten Zeigers ist jedoch ineffizient. Es ist besser, entweder " oder if ip != IntPtr.Zero... " if !IntPtr.Zero.Equals(ip)... zu codieren.

Beim Aufrufen der Windows-API aus verwaltetem Code können Sie anstelle von null übergebenIntPtr.Zero, wenn ein Argument entweder ein Zeiger oder ein nullist. Der folgende Aufruf der Windows-Funktion CreateFile liefert IntPtr.Zero beispielsweise die pSecurityAttributes Argumentwerte und 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)

Hinweis

Obwohl Zero für Windows-API-Funktionen mit Parametern oder Rückgabewerten, die entweder Zeiger oder nullsein können, Zero entspricht null nicht null. Das Übergeben null an die IntPtr.Zero.Equals -Methode gibt immer zurück false.

Sie können auch auf einen null Rückgabewert von Windows-API-Funktionsaufrufen testen, die entweder einen Zeiger oder einen null zurückgeben, indem Sie den zurückgegebenen Wert mit IntPtr.Zerovergleichen. Der Aufruf der GetWindow Funktion im folgenden Beispiel versucht beispielsweise, das Handle eines nicht vorhandenen Fensters abzurufen. Wenn sie von nicht verwaltetem Code aufgerufen wird, gibt die Funktion zurück null, aber wenn sie aus verwaltetem Code aufgerufen wird, gibt sie zurück 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.

Gilt für:

Produkt Versionen
.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