IntPtr.Zero是否等于null?

我想设置ReadFileasynchronous运行,并根据MSDN ,我需要设置lpNumberOfBytesReadnull

如果这是一个asynchronous操作,以避免可能的错误结果,请使用NULL作为此参数。“

例如,如果我有以下内容:

  [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool ReadFile( IntPtr hFile, out byte[] aBuffer, int cbToRead, IntPtr cbThatWereRead, ref OVERLAPPED pOverlapped ); 

我这样称呼它(第四个参数为空):

 Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped); 

将这与用null调用它相同吗? 如果不是,我应该在声明或函数调用中更改哪些内容?

我也很好奇,如果我应该使用SafeHandleHandleRef而不是IntPtrhFile参考? 我知道确保我用CloseHandle(IntPtr)closures句柄,当我完成它,只是不知道是否有任何其他理由使用其他两个选项通过IntPtr 。 我也试图避免使用不安全的代码。

编辑:事实certificate,我不应该设置IntPtr.Zero的第四个参数,因为即使我asynchronous运行,它仍然可以立即返回。 请参阅asynchronous磁盘I / O。 啊,我喜欢矛盾的故事。

对于您列出的P / Invoke目的,您应该使用IntPtr.Zero来代替NULL 。 请注意,这不等同于C# null关键字。

您不能将null分配给值types。 引用types可以为null,因为在不引用对象实例的情况下,值types始终有一个值。

IntPtr.Zero只是一个表示空指针的常量值。

请注意,在C#> = 2.0中有一个错误(function??),其中

 if (IntPtr.Zero == null) { // Won't enter here } 

会正确编译,但不会进入if

Microsoft连接上有一个错误,但是这个错误已经很老了,而且没有任何来自Microsoft人员的意见。