英語で読む

次の方法で共有


IntPtr.Zero フィールド

定義

0 に初期化された符号付き整数を表す読み取り専用フィールド。

C#
public static readonly IntPtr Zero;

フィールド値

IntPtr

注釈

このフィールドの値は と同じ nullではありません。 のインスタンスが 0 以外の IntPtr 値に設定されているかどうかを効率的に判断するには、このフィールドを使用します。

たとえば、変数 ip が の IntPtrインスタンスであるとします。 コンストラクターによって返される値と比較することで、設定されているかどうかを確認できます (例: " if ip != new IntPtr(0)... " )。 ただし、初期化されていないポインターを取得するコンストラクターの呼び出しは非効率的です。 ""、または if !IntPtr.Zero.Equals(ip)... " if ip != IntPtr.Zero... のいずれかをコーディングすることをお勧めします。

マネージ コードから Windows API を呼び出すときに、引数がポインターまたは と予想される場合は、 ではなく nullnullIntPtr.Zeroすことができます。 たとえば、次の Windows CreateFile 関数の呼び出しでは、 および hTemplateFile 引数の値がpSecurityAttributes提供IntPtr.Zeroされます。

C#
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持つ Windows API 関数の場合と同じですが、ポインターまたは nullZero のいずれかを指定できる戻り値は と同じnullではありません。 メソッドにをIntPtr.Zero.Equals渡すとnull、常に が返されますfalse

また、返された値を null と比較することで、ポインターまたは null のいずれかを返す Windows API 関数呼び出しからの戻り値 IntPtr.Zeroをテストすることもできます。 たとえば、次の例の 関数の GetWindow 呼び出しは、存在しないウィンドウのハンドルの取得を試みます。 アンマネージド コードから呼び出された場合、関数は を返 nullしますが、マネージド コードから呼び出されると、 が返されます IntPtr.Zero

C#
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.

適用対象