43

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 );

等しい(タイプ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 );

質問タイプを比較するときに、
なぜoperator ==推奨されるのでしょうか。Equals( Type o )

4

3 に答える 3

47

タイプがタイプではないのはいつですか?BradWilsonによるブログ投稿。要約すると、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
于 2012-02-13T10:56:41.403 に答える
2

理由は単純です。この場合、2つは機能的に同等であり、後者の方が読みやすくなっています。

于 2012-02-10T19:58:12.620 に答える
-2

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バージョンを呼び出すだけです。

于 2012-02-10T20:00:25.483 に答える