IntPtr.Zero是否等于null?
我想设置ReadFile
asynchronous运行,并根据MSDN ,我需要设置lpNumberOfBytesRead
为null
:
如果这是一个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调用它相同吗? 如果不是,我应该在声明或函数调用中更改哪些内容?
我也很好奇,如果我应该使用SafeHandle
或HandleRef
而不是IntPtr
的hFile
参考? 我知道确保我用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人员的意见。