C#类型比较:Type.Equals vs operator ==

时间:2012-02-10 19:56:33

标签: c# types comparison-operators

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 )

3 个答案:

答案 0 :(得分:35)

我建议您阅读Brad Wilson撰写的优秀when is a type not a type?博客文章。总结一下:由CLR管理的运行时类型(由内部类型RuntimeType表示)并不总是与Type相同,可以进行扩展。 Equals会检查underlying system type,而==会检查类型本身。

一个简单的例子:

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

答案 1 :(得分:4)

原因很简单:在这种情况下,两者在功能上是等同的,后者更具可读性。

答案 2 :(得分:1)

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

  

Equals方法只是System.Object中定义的虚拟方法   被任何一个选择这样做的课程所覆盖。 ==运算符是一个   运算符,可以通过类重载,但通常具有   身份行为。

     

对于尚未超载的参考类型,进行比较   两个引用是否引用同一个对象 - 这是确切的   Equals在System.Object中的实现。

     

默认情况下,值类型不会为==提供重载。然而,   框架提供的大多数值类型都提供了自己的值   超载。值类型的默认实现是   由ValueType提供,并使用反射进行比较,   这使得它明显慢于特定类型   实施通常是。这个实现也称之为   等于被比较的两个值中的引用对。

     但是,这两种比较的主要区别在于   正常使用(您不太可能定义自己的值类型   经常)是多态性。运算符超载,未被覆盖,   这意味着除非编译器知道调用更具体   版本,它只会调用身份版本。