[C#.NET] 運算子 "==" 與 Equals

[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

Image result for microsoft+mvp+logo