Search code examples
c#.netpinvoke

new IntPtr(0) vs. IntPtr.Zero


Is there any difference between the two statements:

IntPtr myPtr = new IntPtr(0);
IntPtr myPtr2 = IntPtr.Zero;

I have seen many samples that use PInvoke that prefer the first syntax if the myPtr argument is sent by ref to the called function. If I'll replace all new IntPtr(0) with IntPtr.Zero in my application, will it cause any damage?


Solution

  • IntPtr is a value type, so unlike String.Empty there's relatively little benefit in having the static property IntPtr.Zero

    As soon as you pass IntPtr.Zero anywhere you'll get a copy, so for variable initialisation it 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 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 have already said.