[C#.NET] 運算子 "==" 與 Equals
在.NET裡,相等性有兩類:
1.值相等:兩個變數的值是否相等
2.引用相等:兩個變數是否引為同一執行個體
也就是說 == 與 Equals 的功能是一樣的
我用上篇 [C#.NET] 利用序列化進行類別深複製 所建立的類別來說明
public void ReferenceEqualsTest()
{
Person expected = new Person()
{
Age = 18,
Address = "地球村",
Name = new Name("余", "小章"),
Phones = new List<CellPhone>()
{
new CellPhone()
{
CountryCode="+886",
Phone="12312121212",
},
new CellPhone()
{
CountryCode="+886",
Phone="1232434",
},
new CellPhone()
{
CountryCode="+886",
Phone="34535123243124",
}
}
};
Person actual = expected.DeepClone();
actual.Phones[0].Phone = "";
Assert.AreNotEqual(expected.Phones[0].Phone, actual.Phones[0].Phone);
Assert.IsFalse(expected.Equals(actual));
Assert.IsFalse(expected == actual);
Assert.IsTrue(expected.Age.Equals(expected.Age));
Assert.IsTrue(expected.Age == actual.Age);
}
上述段程式碼中:
直接比較兩個變數時,都會回傳false,因為這是兩份不同的執行個體。
actual == expected
當我比較變數裡的值時,相等情況下都會回傳true
expected.Age == actual.Age
當兩個變數參考的是同一份執行個體,就會回傳true。
Assert.IsTrue(expected.Equals(actual));
Assert.IsTrue(expected == actual);
運算子 == 與 Equals 都是可以被重寫的,參考 larry 所寫的 [C#]Effective C# 條款九: 理解幾個相等判斷之間的關係
重寫了Equals時也要重寫getHashCode
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET