新的IntPtr(0)与IntPtr.Zero

Yuv*_*led 24 .net c# pinvoke

这两个陈述之间有什么区别:

IntPtr myPtr = new IntPtr(0);
IntPtr myPtr2 = IntPtr.Zero;
Run Code Online (Sandbox Code Playgroud)

我已经看到许多使用PInvoke的示例,如果myPtr参数由ref发送到被调用函数,则它更喜欢第一种语法.如果我在我的应用程序中用IntPtr.Zero替换所有新的IntPtr(0),它会造成任何损害吗?

Kei*_*ith 24

IntPtr是一种值类型,因此与String.Empty静态属性相比,它的好处不大IntPtr.Zero

一旦你通过IntPtr.Zero任何地方你就会得到一份副本,所以对于变量初始化它没有任何区别:

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
Run Code Online (Sandbox Code Playgroud)

有一个例外,那就是比较:

if( myPtr != new IntPtr(0) ) {
    //new pointer initialised to check
}

if( myPtr != IntPtr.Zero ) {
    //no new pointer needed
}
Run Code Online (Sandbox Code Playgroud)

正如几张海报已经说过的那样.


Ric*_*lay 7

它们在功能上是等价的,因此它不会引起任何问题.

IntPtr.Zero代表结构的默认状态(它被声明,但不使用的构造),所以的默认值intptr (void*)null.然而,由于(void*)null(void*)0是等价的,IntPtr.Zero == new IntPtr(0)

编辑:虽然它们是等价的,但我建议IntPtr.Zero用于比较,因为它更容易阅读.


bru*_*nde 5

使用IntPtr.Zero将允许您避免新的实例IntPtr.

来自msdn:

使用此字段可以有效地确定IntPtr的实例是否已设置为零以外的值