对于这几点的区别网上经常有各种答案,而且常常会出现答案之间是互相矛盾的。要嘛就是根本含糊的解释不清楚,只是把测试结果扔上来并没有言简意赅的写出他们之间的比较。难道面试的时候考官问你,你也要在纸上写一大堆代码,然后告诉他这个结果是什么,那个结果是什么?后啦 扯远了。翻了下博客园和msdn 大致的结果如下(其实二者的差别是非常小的,再加上几乎很少有人用到这些特殊的点,所以会被人们所遗忘):
区分:
【ReferenceEquals】
根据名字就可以看出来这个关键字是纯粹的比较引用。
1.ReferenceEquals用于比较引用类型。
2.如果比较的是值类型(会自动装箱),则返回false。
【Equals】
1.Equals用于比较值类型和引用类型。
2.可以被子类重写。//因为他是个方法
3.如果不重写Equals方法,Equals方法效果与==一样,引用类型比较引用,值类型比较值。
4.如果重写Equals方法,需要重写GetHashcode方法,当该类作为键值对的键时,需要唯一的Hashcode,所以此时的GetHashcode方法需要被重写。
【==】
1.==用于比较值类型和引用类型。
2.引用类型比较引用,值类型比较值。
--------------------------------------------------------------------------------------------
比较
1.对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。
2.对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。
3.* 对于string 类型,== 比较字符串的值。
总结:
-
==操作比较的是两个变量的值是否相等。
-
equals()方法比较的是两个对象的内容是否一致(包括地址),即equals比较引用类型是否是对同一个对象的引用。
*注:第3点中讲到的string 类型用"=="比较字符串值,其实是不正确的。只是外在的表现如此。因为在C#中,会存在字符串留用。在实际的后台操作中仍是采用比较引用对象。
那一丁点区别
==是一个逻辑运算符,判断运算符两边的数值或类型是否相等
而Equals是一个方法,虽然两个者有相近的意近,但还是有所不能的,在C#,所有的类型都是从Object继承,作为Object的回个方法之一的Equals就会被继承下来,所以能用来判断,但==这个运算符就不一定了,下面举个例子
struct AA
{
public int i;
}
static void Main(string[] args)
{
AA a = new AA();
a.i = 100;
AA c = new AA();
c.i = 101;
Console.WriteLine ( a==c );
Console.WriteLine(a.Equals (c));
}
你会发现a==c会报错,说==不支持这种判断,但a.Equals(c)是没错的,因为struct也继承至Object。
参考文献
http://www.cnblogs.com/fb-boy/p/3460986.html
http://social.msdn.microsoft.com/Forums/zh-CN/e75fec04-b12f-4bf4-9d9d-7d3815c49d60/-equals-?forum=visualcshartzhchs