C#中Equals和==的区别 (面试官经常会问到)
首先对于值类型来说,并没有什么区别。区别只针对于引用类型。
一、值类型
1.对于值类型来说,两者比较的都是“内容”是否相同,也就是值是否相同(值类型只有存在栈上)。
二、引用类型
1.对于引用类型来说,本身的值存在堆中,在栈中存入本身值的引用,可以根据引用找到自己。
所以:
对于引用类型来说,==比较的两个变量的”引用“是否一样,也就是“地址”是否一样。而equals比较的是”内容“是否一样。
1. 比较引用类型:
Person p1 = new Person("aa", 12); Person p2 = new Person("aa", 12); Console.WriteLine("Equals和= =(等于号)的比较"); Console.WriteLine("p1==p2 " + (p1 == p2));//结果:false Console.WriteLine("p1.Equals(p2) " + p1.Equals(p2));//结果:false
p1==p2 的结果是false,很简单,因为他们本身是两个不同的变量,引用地址是不同的。
那么p1.Equals(p2) 为什么是false 呢?
因为Equlas是object的一个虚方法,而person并没有对其进行重写,此时调用的是父类的Equlas方法,但是父类是不知道p1和p2中有哪些成员的,
所以返回false。
如果想让其相等,就要重写父类的Equlas方法,比如:
public override bool Equals(object obj) { Person p = obj as Person; //对变量的所有的属性都要进行比较 只有都相同才返回true if (this.Age == p.Age && this.Name == p.Name) { return true; } else { return false; } }
在开发过程中,会经常用到string类型的字段进行Equlas比较,但是比较的结果和==一模一样。比如:
string s1 = "abc"; string s2 = "abc"; Console.WriteLine("s1==s2 " + (s1 == s2));//true Console.WriteLine("s1.Equals(s2) " + s1.Equals(s2));//true
为什么s1和s2两个不同的变量Euulas比较的结果会相同呢?
因为string是微软封装的一个字符串类,在内部已经对==操作符进行了重写。重写后比较的是两个变量的值是否相同。
内部封装如下:
public static bool operator == (string a,string b) { return Equals(a,b); }
因此,对于string类型来说,比较的都是值是否相等。(可以把string当成一个特殊的引用类型)。
总结:对于值类型来说,Equlas和==并没有什么区别,比较的都是值是否相等。
对于引用类型来说,Equlas比较的是值是否相等,==比较的是引用是否相等。string是个特殊的引用类型,内部进行了重写,==比较的是值是否相等。