我试图建立ReadFile
异步运行,并根据MSDN,我需要设置lpNumberOfBytesRead
到null
:“使用NULL这个参数,如果这是一个异步操作,以避免潜在的错误结果”IntPtr.Zero是否等于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)
,只是不确定是否有其他原因使用IntPtr
以上的其他两个选项。我也试着避免使用不安全的代码。
编辑:事实证明,我不应该设置第四个参数IntPtr.Zero
无论如何,因为即使我异步运行,它仍然可以立即返回。见Asynchronous Disk I/O。啊,我喜欢矛盾的故事。
对不起,因为IntPtr.Zero不等于null,所以if语句无效。 – Kobunite 2013-04-04 08:31:20
@Kobunite然后尝试编写'if(IntPtr.Zero ==“Hello”)'看看会发生什么。会有一个编译时错误...问题是没有警告,比较是不可能的,也没有错误。该代码仅由编译器删除。看到生成的IL代码http://goo.gl/6zpPxN – xanatos 2015-09-02 15:40:35
对不起,但它编译,因为它有效地使用'=='操作符重载隐式转换为'(IntPtr?)IntPtr.Zero ==(IntPtr? )null' – Marc 2015-12-11 20:00:37