2つのステートメントの間に違いはありますか?
IntPtr myPtr = new IntPtr(0);
IntPtr myPtr2 = IntPtr.Zero;
MyPtr引数がrefによって呼び出された関数に送信される場合、最初の構文を優先するPInvokeを使用する多くのサンプルを見てきました。アプリケーションですべての新しいIntPtr(0)をIntPtr.Zeroに置き換えると、損傷が発生しますか?
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
}
いくつかのポスターがすでに言っているように。
これらは機能的に同等であるため、問題は発生しません。
_IntPtr.Zero
_は構造体のデフォルト状態を表します(宣言されていますが、コンストラクターは使用されていません)。したがって、intptr (void*)
のデフォルト値はnull
になります。ただし、_(void*)null
_と_(void*)0
_は同等であるため、IntPtr.Zero == new IntPtr(0)
編集:同等ですが、読みやすいので、比較には_IntPtr.Zero
_を使用することをお勧めします。
の用法 IntPtr.Zero
を使用すると、IntPtr
の新しいインスタンスを回避できます。
から msdn :
このフィールドを使用して、IntPtrのインスタンスがゼロ以外の値に設定されているかどうかを効率的に判別します。
_IntPtr.Zero
_をrefで渡し、受信者が参照を変更しようとするとどうなりますか?その瞬間から、IntPtr.Zero != new IntPtr(0)
になるのでしょうか、それとも受信者が変更を行おうとしたときに何らかの例外を受け取るのでしょうか。
これについてはよくわかりませんが、合理的な説明のようです。
JITterは、IntPtr.Sizeをインライン化するのと同じ方法でIntPtr.Zeroをインライン化できます。