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 のインスタンスがゼロ以外の値に設定されているかどうかを効率的に判断します
refを渡しIntPtr.Zero
、受信者が参照を変更しようとするとどうなりますか? その瞬間からIntPtr.Zero != new IntPtr(0)
、または受信者が変更を試みたときに何らかの例外を受け取るでしょうか?
これについてはよくわかりませんが、合理的な説明のようです。
JITter は、IntPtr.Size をインライン化するのと同じ方法で、IntPtr.Zero をインライン化できます。
それは主に問題のカプセル化です(そしてパフォーマンスですが、それほどではありません)。将来のある時点で、Microsoft は、初期化されたポインター値が と等しくなり0xDEADBEEF
、すべてのnew IntPtr(0)
コードが無効になると決定する可能性があります (可能性は非常に低いですが)。
パフォーマンスに関する限り、MSDN は次のように述べています。
たとえば、変数
ip
が のインスタンスであるとしますIntPtr
。コンストラクターによって返される値と比較することで、設定されているかどうかを判断できます。たとえば、" if ip != new IntPtr(0)... ". ただし、コンストラクターを呼び出して初期化されていないポインターを取得するのは非効率的です。if ip != IntPtr.Zero...
" " または " " のいずれかをコーディングすることをお勧めしますif !IntPtr.Zero.Equals(ip)...
。