新しいIntPtr(0)対IntPtr.Zero

.net c# pinvoke

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

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

myPtr引数がrefによって呼び出された関数に送信される場合、最初の構文を好むPInvokeを使用する多くのサンプルを見ました。 私のアプリケーションですべての新しいIntPtr(0)をIntPtr.Zeroに置き換える場合、それは何らかの損害を与えますか?

  24  3


ベストアンサー

`+ 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


それらは機能的に同等です、それでそれは問題を引き起こさないはずです。

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

*編集:*これらは同等ですが、読みやすくするため、比較には `+ IntPtr.Zero +`を使用することをお勧めします。

7


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

msdnから:

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

5


refで `+ IntPtr.Zero `を渡し、受信者が参照を変更しようとするとどうなりますか? その瞬間から、 ` IntPtr.Zero!= new IntPtr(0)+`になりますか、または受信者は変更を試みたときに何らかの例外を受け取りますか?

よくわかりませんが、合理的な説明のようです。

1


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

0


それは主に問題のカプセル化です(そしてパフォーマンスの問題ですが、それほどではありませんが)。 将来のある時点で、Microsoftは、ユニタライズされたポインター値が今後「+ 0xDEADBEEF 」に等しくなり、すべての「 new IntPtr(0)+」コードを無効にすることを決定する可能性が非常に低いです。

パフォーマンスに関しては、MSDNはこう述べています。

_
たとえば、変数「+ ip 」が「 IntPtr 」のインスタンスであると仮定します。 設定されているかどうかは、コンストラクタから返される値と比較することで判断できます。たとえば、次のようになります。 “if ip!= new IntPtr(0)… “. ただし、初期化されていないポインタを取得するためにコンストラクタを呼び出すのは非効率的です。 「 ` if ip!= IntPtr.Zero …​ `」または「 ` if!IntPtr.Zero.Equals(ip)…​ +`」のいずれかをコーディングすることをお勧めします。
_

-2


タイトルとURLをコピーしました