Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is IntPtr.Zero equivalent to null?

I am trying to setup ReadFile to run asynchronously and according to MSDN, I need to set lpNumberOfBytesRead to null:

"Use NULL for this parameter if this is an asynchronous operation to avoid potentially erroneous results."

For example, if I have the following:

  [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   ); 

and I call it like this (with the intention of having the 4th parameter being null):

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

will that be the same as calling it with null? If not, what should I change in the declaration or in the function call itself?

I was also curious if I should be using SafeHandle or HandleRef instead of IntPtr for the hFile reference? I know to make sure that I close the handle with CloseHandle(IntPtr) when I'm done with it, just not sure if there is any othe reason to use the other two options over IntPtr. I am also tryingn to avoid using unsafe code.

EDIT: As it turns out, I shouldnt be setting the fourth parameter to IntPtr.Zero anyway, because even though I am running asynchronously, it could still return right away. See Asynchronous Disk I/O. Ahh, I love contradicting stories.

like image 890
SwDevMan81 Avatar asked Sep 21 '09 21:09

SwDevMan81


People also ask

Can IntPtr be null?

IntPtr is a value type and cannot be null.

What is IntPtr C#?

The IntPtr type can be used by languages that support pointers and as a common means of referring to data between languages that do and do not support pointers. IntPtr objects can also be used to hold handles. For example, instances of IntPtr are used extensively in the System. IO.


1 Answers

For P/Invoke purposes like you've listed, you should use IntPtr.Zero in place of NULL. Note that this is not equivalent to the C# null keyword, however.

like image 157
Michael Avatar answered Sep 20 '22 08:09

Michael