[ACCEPTED]-new IntPtr(0) vs. IntPtr.Zero-pinvoke
IntPtr
is a value type, so unlike String.Empty
there's relatively 6 little benefit in having the static property 5 IntPtr.Zero
As soon as you pass IntPtr.Zero
anywhere you'll get 4 a copy, so for variable initialisation it 3 makes no difference:
IntPtr myPtr = new IntPtr(0);
IntPtr myPtr2 = IntPtr.Zero;
//using myPtr or myPtr2 makes no difference
//you can pass myPtr2 by ref, it's now a copy
There is one exception, and 2 that's comparison:
if( myPtr != new IntPtr(0) ) {
//new pointer initialised to check
}
if( myPtr != IntPtr.Zero ) {
//no new pointer needed
}
As a couple of posters 1 have already said.
They are functionally equivalent, so it 7 should cause no problems.
IntPtr.Zero
represents the 6 default state of the structure (it is declared 5 but no constructor is used), so the default 4 value of the intptr (void*)
would be null
. However, as (void*)null
and 3 (void*)0
are equivalent, IntPtr.Zero == new IntPtr(0)
Edit: While they are equivalent, I 2 do recommend using IntPtr.Zero
for comparisons since 1 it simply is easier to read.
The use of IntPtr.Zero
will allow you to avoid a new 3 instance of IntPtr
.
from msdn:
Use this field to efficiently determine 2 whether an instance of IntPtr has been 1 set to a value other than zero
What happens if you pass IntPtr.Zero
by ref, and the 6 recipient tries to modify the reference? From 5 that moment forth, would IntPtr.Zero != new IntPtr(0)
, or would the 4 recipient receive some kind of exception 3 upon trying to make the change?
I'm not sure 2 about this, but it seems like a reasonable 1 explanation.
The JITter can inline IntPtr.Zero the same 1 way it inlines IntPtr.Size.
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.