简单来讲:
"==" : 比较两个变量栈中的数值是否相等,(对于引用类型来讲,栈中存储的是其引用地址)
"equals" : 是否引用的同一个对象,即堆中的内容是否相同。 值类型与引用类型值类型包括:(C#的所有值类型均隐式派生自System.ValueType)
- 结构类型:struct(直接派生于System.ValueType);
- 枚举类型: enum(派生于System.Enum);
- 13种简单类型:char byte sbyte short ushort int uint long ulong float decimal char bool
引用类型包括:
数组,用户定义的类、接口、委托,object,字符串(.Net 框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一个引用类型,但是重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样)下面有一个例子,很好的说明了他们之间的区别,重新整理了一下更易理解。
引自:
//第一对输出 ,字符串a和字符串b的两个比较是相等的。
string a = new string(new char[] { 'h','e','l','l','o' });string b = new string(new char[] { 'h','e','l','l','o' });textBox1.Text = "a == b: " + (a == b).ToString()+"\r\n";
textBox1.AppendText( "a.Equals(b): " + a.Equals(b).ToString()+"\r\n");//a == b: True
//a.Equals(b): True//第二对输出 object g = a 和object h = b , 在内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。
object g = a;object h = b;textBox1.AppendText( "g == h: " + (g == h).ToString()+"\r\n");textBox1.AppendText( "g.Equals(h): " + g.Equals(h).ToString()+"\r\n");//g == h: False//g.Equals(h): True//如果将字符串a和b作这样的修改:
// string a="aa";//string b="aa";//则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。
//对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。
Person p1 = new Person("jia");
Person p2 = new Person("jia");textBox1.AppendText( "p1 == p2: " + (p1 == p2).ToString()+"\r\n");textBox1.AppendText("p1.Equals(p2): " + p1.Equals(p2).ToString() + "\r\n");//p1 == p2: False//p1.Equals(p2): False//对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true
Person p3 = new Person("jia");Person p4 = p3;textBox1.AppendText("p3 == p4: " + (p3 == p4).ToString()+"\r\n");textBox1.AppendText( "p3.Equals(p4): " + p3.Equals(p4).ToString()+"\r\n");//p3 == p4: True
//p3.Equals(p4): True 如有问题或建议,欢迎留言 ~ 博客地址: |