web-dev-qa-db-ja.com

C#型の比較:Type.Equals vs operator ==

Resharperは、以下を変更することを提案しています。

_Type foo = typeof( Foo );
Type bar = typeof( Bar );

if( foo.Equals( bar ) ) { ... }
_

に:

_if( foo == bar ) { ... }
_

演算子==

_// Summary:
//     Indicates whether two System.Type objects are equal.
//
// Parameters:
//   left:
//     The first object to compare.
//
//   right:
//     The second object to compare.
//
// Returns:
//     true if left is equal to right; otherwise, false.
public static bool operator ==( Type left, Type right );
_

等しい(Type o)

_// Summary:
//     Determines if the underlying system type of the current System.Type is the
//     same as the underlying system type of the specified System.Type.
//
// Parameters:
//   o:
//     The System.Type whose underlying system type is to be compared with the underlying
//     system type of the current System.Type.
//
// Returns:
//     true if the underlying system type of o is the same as the underlying system
//     type of the current System.Type; otherwise, false.
public virtual bool Equals( Type o );
_

質問
Typesを比較するときにEquals( Type o )よりも_operator ==_が推奨される理由

38
Metro Smurf

Brad Wilsonによる優れた タイプがタイプではない場合 ブログ投稿を読むことをお勧めします。要約すると、CLRによって管理されるランタイムタイプ(内部タイプRuntimeTypeで表される)は、拡張可能なTypeと必ずしも同じではありません。 Equals基になるシステムタイプ をチェックしますが、==は、タイプ自体をチェックします。

簡単な例:

Type type = new TypeDelegator(typeof(int));
Console.WriteLine(type.Equals(typeof(int))); // Prints True
Console.WriteLine(type == typeof(int));      // Prints False
36

理由は簡単です。この場合、2つは機能的に同等であり、後者は読みやすいです。

4
Justin Niessner

から http://blogs.msdn.com/b/csharpfaq/archive/2004/03/29/when-should-i-use-and-when-should-i-use-equals.aspx =

Equalsメソッドは、System.Objectで定義された仮想メソッドであり、そのように選択したクラスによってオーバーライドされます。 ==演算子は、クラスによってオーバーロードされる可能性のある演算子ですが、通常はIDの振る舞いを持っています。

==がオーバーロードされていない参照型の場合、2つの参照が同じオブジェクトを参照しているかどうかを比較します。これは、System.ObjectでのEqualsの実装とまったく同じです。

値タイプは、デフォルトで==のオーバーロードを提供しません。ただし、フレームワークによって提供される値型のほとんどは、独自のオーバーロードを提供します。値型のEqualsのデフォルト実装はValueTypeによって提供され、リフレクションを使用して比較を行います。これにより、型固有の実装が通常よりも大幅に遅くなります。この実装は、比較される2つの値内の参照のペアでEqualsも呼び出します。

ただし、通常の使用(非常に頻繁に独自の値型を定義する可能性は低い)での2種類の比較の主な違いは多態性です。演算子はオーバーライドされずにオーバーロードされます。つまり、コンパイラーがより具体的なバージョンを呼び出すことを知らない限り、IDバージョンを呼び出すだけです。

1
Paul Nikonowicz