代码改变世界

A.Equals(B)和A==B的区别

2013-10-12 10:01  zhaodacheng  阅读(3649)  评论(0编辑  收藏  举报

Equals == 都是用于比较。

如果ab都是值类型,则a.Equals(b) a == b 结果相同,但是在引用类型是它们的行为是不同的:

string a = new string(new char[] {'d', 'a', 'n', 'c', 'e'});
string b = new string(new char[] {'d', 'a', 'n', 'c', 'e'});
object c = a;
object d = b;

Console.WriteLine (a==b);
Console.WriteLine (a.Equals(b));
Console.WriteLine (c==d);
Console.WriteLine (c.Equals(d));

输出结果:

True
True
False
True

值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。

"==" : 操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

"equals" : 操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

string是一种特殊的引用类型,使string对象用起来就像是值类型一样,string类型的==操作实际上是比较两个字符串的值是否相同。

所以:
Console.WriteLine (a==b);            // 比较两个字符串的值 - 返回true
Console.WriteLine (a.Equals(b));    // 比较两个字符串的值 - 返回true
Console.WriteLine (c==d);           // 比较两个对象的在堆中的地址是否相同 - 返回false
Console.WriteLine (c.Equals(d));   // 比较两个对象的所指向的内容是否相同 - 返回true