2010-12-10 26 views

答えて

5

ReferenceEqualsを使用する場合は、特別な処理(たとえば、オーバーロードされた演算子)が適用されていないことを確認してください。これは、非結合ジェネリックで使用すると、異なる結果につながります。

3

は、それが参照比較です(それはおそらくnull Sにすべきであるけれども)を行うしない場合がありますので==オペレータは、クラスの実装により、オーバーロードすることができ、この興味深い記事

Performance Tip: Prefer (((Object) x)== null) to Object.ReferenceEquals(x,null)

+0

その記事は時代遅れですが、間違った結論になります。 ILは、.NET 4.0以降の両方のアプローチで正確に同等です。この記事の例を試してみると、簡単に理解できます。読みやすさのため、私は 'ReferenceEquals'を提案します。 – Abel

1

を見てみましょう。 object.ReferenceEqualsはできませんので、常に確実に参照比較を行います。

乾杯 マティアス

1

はも参照メソッドをオーバーライドすることはできませんので、あなたは常に比較がオブジェクト参照を比較するために起こっているとEqualsメソッドのいくつかのオーバーライドに渡されることはないと確信することができます。

4

シンプルなものは通常、最も効率的です:(myObject == null)は、彼らが別のものにコンパイルが、彼らは通常、同じ効果を持っている

ルックthis記事

+0

一見面白い読み物ですが、参照された記事ですが、.NET 2.0を対象としています。その時点で、.NET 4.0はしばらくの間使われていましたが、 '(オブジェクト)myObj == null'と' ReferenceEquals'の使用に違いはありません。しかし、この投稿のあなたの提案(7年前)は非常に危険で(リンクされた記事で説明されているように)、確かにキャストなしで使用するべきではありません(本当にオーバーロードを使用しない限り、 "それとは関係ない)。 – Abel

1

でよりパフォーマンスです 。 if (myObject == null)の結果はceqオペコードになります。これは、より速いコードにコンパイルすることを期待しています。 object.ReferenceEqualsは他のメソッド呼び出しと同じです。

myObjectoperator=の方法を使用している場合とは異なります。これが存在する場合、コードはceqを使用する代わりにこのメソッドを呼び出します。 operator=は好きなことを何でもすることができます。

いつもif (myObject == null)あなたは理由がない限り。

+0

イリノイ州のメソッド呼び出しであるからといって、ジッタが終了するとそれがメソッド呼び出しであるとは限りません。参照は非常に短いため、インライン展開される可能性があります。そして、内容はちょうど 'obj1 == obj2'なので、==とまったく同じパフォーマンスが期待できますが、オブジェクトへの引数をキャストするので、オーバーロードされた==演算子は影響を受けません。 – CodesInChaos

+0

これは、他のどのようなメソッド呼び出しでもありません。コンパイル時に、ILはそのメソッド呼び出しを持たず、代わりに両方のアプローチで同等の(IL-4.0以降)特殊ILコードが使用されます。 @ CodeInChaosは正解ですが、まったく同じパフォーマンス(とIL)です。 – Abel

関連する問題