C#内equals和==的用法
用法分三種情況
值類型的比較
对于值类型来说 两者比较的都是”内容”是否相同,即 值 是否一样,很显然此时两者是划等号的。
int s1 = 18;
int s2 = 18;
Console.WriteLine("s1==s2 : {0}" ,(s1 == s2));
Console.WriteLine("s1.Equals(s2) : {0}" , s1.Equals(s2));
結果如圖
引用類型比較
對於引用數據類型如string的用法不一樣。
==是對兩者的地址進行比較,而equals還是比較的值
string s3 = "acv";
string s4 = "acv";
Console.WriteLine("s3==s4 : {0}", (s3 == s4));
Console.WriteLine("s3.Equals(s4) : {0}", s3.Equals(s4));
結果如圖
這裏會有疑問:按理説使用 == 作比較的結果是false,爲啥是True?
答案: 由于string是微软封装的一个字符串类,在内部他已经对 = = 操作符进行了重写。重写后他比较的则是两个变量的内容是否相同,
==的實現邏輯如下:
public static bool operator ==(string a, string b){
return equals(a,b);
}
重写后的 = = 操作符内部调用的即是 equals 方法,所以输出的是true
自定義的其他引用類型,如Person
Person p1 = new Person(1, "qwe");
Person p2 = new Person(1, "qwe");
Console.WriteLine("p1==p2 : {0}", (p1 == p2));
Console.WriteLine("p1.Equals(p2) : {0}", p1.Equals(p2));
結果如圖
==的結果顯而易見,不同的對象地址肯定不一樣
但是equals的結果也是 false ,爲什麽?
原因就在于在Equals是Object中的一个虚方法,而person类中没有对她进行重写,因此此时调用的仍是父类中的Equals方法。但是父类是无法知道你都有哪些成员字段的,因此返回的是false。要想让他能够比较两个变量的内容是否相同,那就应该重写Equals方法。
private int age;
private string name;
public int Age { set; get; }
public string Name { set; get; }
public Person(int i, string str) {
}
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;
}
}
結果如下:
結論
Equals比较的是变量的内容是否相同,而= =比较的则是引用地址是否相同(前提:此种类型内部没有对Equals 或= = 进行重写操作,否则输出可能会有不同)
string 类型是个特例,因为他的内部对这两个都进行了重写。