在C#中,==和Equals都是比较的意思,那他们有什么不同呢?相信很多初学者都搞不清楚这两个的区别,所以我们来剖析一下
1.值类型的比较
static void Main(string[] args)
{
int a = 100;
int b = 100;
Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b));
}
对于值类型来说 两者比较的都是”内容”是否相同,即 值 是否一样,很显然此时两者是划等号的。
2.引用类型的比较
class Program
{
static void Main(string[] args)
{
MyInt myInt1 = new MyInt();
myInt1._a = 100;
myInt1._b = 'a';
MyInt myInt2 = new MyInt();
myInt2._a = 100;
myInt2._b = 'a';
Console.WriteLine(myInt1==myInt2);
Console.WriteLine(myInt1.Equals(myInt2));
}
}
public class MyInt
{
public int _a;
public char _b;
}
对于 myInt1==myInt2 比较的结果是false,这点是毫无疑问的,因为他俩是两个不同的变量,所以引用的地址也是不同的。
但是对于myInt1.Equals(myInt2)返回false,可能有人会产生疑问,myInt1和myInt2的内容是相同的啊,为什么他俩的比较结果却是为false呢?原因就在于在Equals是Object中的一个虚方法,而person类中没有对她进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是false。要想让他能够比较两个变量的内容是否相同,那就应该重写Equals方法。
3.String类型的==和Equals
static void Main(string[] args)
{
String str1 = "abc";
String str2 = "abc";
Console.WriteLine(str1 == str2);
Console.WriteLine(str1.Equals(str2));
}
这里str1==str2大家应该清楚了,就是判断字符串是否相同,可Equals为什么也是True呢?这是由于微软在内部对String里面==和Equals进行了重写,重写后他比较的则是两个变量的内容是否相同,重写后的 = = 操作符内部调用的即是 equals** 方法,所以输出的是True。