1、对于值类型:
如果对象的值相等,则相等运算符==返回True,否则返回False。
2、对于引用类型:
==操作符比较的是两个变量的值是否相等,或两个引用是不是指向同一个内存地址。
equals()方法比较的是两个对象指向的内存空间里的内容是不是相同。equals也就是比较两个“引用类型”是否是对同一个对象的引用。即两个对象的内容是否相等。
public class ClassPerson { public ClassPerson(string strname) { name = strname; } private string name = null; public string Name { set { name = value; } get { return name; } } } string s1 = "test"; string s2 = "test"; Console.WriteLine(s1 == s2); //True Console.WriteLine(s1.Equals(s2)); //True object o1 = s1; object o2 = s2; Console.WriteLine(o1 == o2); //True Console.WriteLine(o1.Equals(o2)); //True string s3 = new string(new char[] { 't', 'e', 's', 't' }); string s4 = new string(new char[] { 't', 'e', 's', 't' }); Console.WriteLine(s3 == s4); //True Console.WriteLine(s3.Equals(s4)); //True object o3 = s3; object o4 = s4; Console.WriteLine(o3 == o4); //False Console.WriteLine(o3.Equals(o4)); //True ClassPerson p1 = new ClassPerson("ltp"); ClassPerson p2 = new ClassPerson("ltp"); Console.WriteLine(p1 == p2); //False Console.WriteLine(p1.Equals(p2)); //False ClassPerson p3 = new ClassPerson("ltp"); ClassPerson p4 = p3; Console.WriteLine(p3 == p4); //True Console.WriteLine(p3.Equals(p4)); //True
值类型是存储在内存中的堆栈(以下简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的是两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
而字符串是一个特殊的引用型类型,在C#语言中,重载了string对象的很多方法(包括equals()方法),使string对象用起来就像是值类型一样。
因此在上面的例子中,字符串s3和字符串s4的两个比较是相等的。
因为object o3和object o4在内存中是两个不同的对象,所以存储的地址(在栈中的内容)是不相同的,故不相等。而o3.Equals(o4)用的是equals()方法,比较的是两个对象存储地址对应的内存空间里的内容,故相等。
而对于object o1和object o2是相等的。因为系统并没有给字符串s2分配内存,只是将“test”指向了s2。所以s1和s2指向的是同一个字符串(字符串在这种赋值的情况下被做了内存的优化)。
对于p1和p2,也是内存中两个不同的对象,所以在内存中地地址肯定不相同,故p1==p2会返回False;又因为p1和p2是对不同对象的引用,所以p1.equals(p2)也返回False。
对于p3和p4,由于p4=p3,p3将对象的引用赋给了p4,p3和p4指向同一地址,是对同一个对象的引用,所以两个比较都返回True。