web-dev-qa-db-ja.com

新しいIntPtr(0)とIntPtr.Zero

2つのステートメントの間に違いはありますか?

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

MyPtr引数がrefによって呼び出された関数に送信される場合、最初の構文を優先するPInvokeを使用する多くのサンプルを見てきました。アプリケーションですべての新しいIntPtr(0)をIntPtr.Zeroに置き換えると、損傷が発生しますか?

24
Yuval Peled

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

例外が1つあり、それは比較です。

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

if( myPtr != IntPtr.Zero ) {
    //no new pointer needed
}

いくつかのポスターがすでに言っているように。

24
Keith

これらは機能的に同等であるため、問題は発生しません。

_IntPtr.Zero_は構造体のデフォルト状態を表します(宣言されていますが、コンストラクターは使用されていません)。したがって、intptr (void*)のデフォルト値はnullになります。ただし、_(void*)null_と_(void*)0_は同等であるため、IntPtr.Zero == new IntPtr(0)

編集:同等ですが、読みやすいので、比較には_IntPtr.Zero_を使用することをお勧めします。

7
Richard Szalay

の用法 IntPtr.Zeroを使用すると、IntPtrの新しいインスタンスを回避できます。

から msdn

このフィールドを使用して、IntPtrのインスタンスがゼロ以外の値に設定されているかどうかを効率的に判別します。

5
bruno conde

_IntPtr.Zero_をrefで渡し、受信者が参照を変更しようとするとどうなりますか?その瞬間から、IntPtr.Zero != new IntPtr(0)になるのでしょうか、それとも受信者が変更を行おうとしたときに何らかの例外を受け取るのでしょうか。

これについてはよくわかりませんが、合理的な説明のようです。

1
Drew Noakes

JITterは、IntPtr.Sizeをインライン化するのと同じ方法でIntPtr.Zeroをインライン化できます。

0