Equals 和 == 都是用于比较。spa
若是a和b都是值类型,则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));blog
输出结果:ip
值类型是存储在内存中的堆栈(之后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其自己则存储在堆中。
"==" : 操做比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
"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