首先,Equals方法是一个来源于在System.Object的方法,它是一个虚函数,所有的类都可以对其进行覆盖(overridden)操作.
==操作符,所有的类都可以对其重载(overloaded)操作.
引用类型: 对于所有没有重载==操作符的对引用类型来说,==操作符的作用相当于比较两个对象是否引用同一个对象,其本质相当于: Object类的static ReferenceEquals() 方法.
值类型: 值类型基类ValueType没有提供==操作符默认的重载,但是大多数的值类型提供各自的重载.对于Equals方法,ValueType使用反射的方法实现了比较,这也导致速度会慢一些.
主要区别主要集中在多态情况下:使用Equals方法,对象根据多态特性会自动找到相对类型的Equals方法的覆盖,而==操作符只能看那当前类型是否有对==进行重载,如果没有重载,那么两个引用比较的将是是否指向同一对象.
示例:
string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
Console.WriteLine (a==b);
Console.WriteLine (a.Equals(b));
object c = a;
object d = b;
Console.WriteLine (c==d);
Console.WriteLine (c.Equals(d));
运行结果
True//string对==operator进行了重载
True//Equals在String类中有相应的覆盖版本
False//Object类型的==operator操作,相当于比较两个引用是否指向相同的对象
True//Equals会调用String类的Equals函数
总而言之:
对于引用类型:使用Equals()方法,除了string类,==的阅读性会更好;
对于值类型:使用==操作符.