簡體   English   中英

為對象自動生成自然的 Equals 和 GetHashCode 函數

[英]Automatically generating natural Equals and GetHashCode functions for objects

我發現自己在創建類時經常重寫EqualsGetHashCode函數。 這似乎是浪費時間,因為大多數時候我的Equals只是檢查每個成員的相等性(或迭代以檢查 IEnumerable 元素的相等性)。 同樣,我的GetHashCode通常只是hash = hash * <prime> + <sub-hash>的標准列表,可能是重復的。

是否有庫可以生成這種自然的 Equals 和 GetHashCode 函數? 似乎可以使用 C# 的一些元編程功能。

Visual Studio 2019 和 2022 可以為你生成這些成員。

為此,請右鍵單擊 class 名稱和 select Quick actions and refactorings... ,然后右鍵單擊 select Generate Equals and GetHashCode

這將顯示一個對話框,您可以在其中選擇要貢獻給 Equals 和 GetHashCode 的成員。

例如,給出這個 class:

public sealed class TestClass
{
    public TestClass(int x, string y)
    {
        X = x;
        Y = y;
    }

    public int X { get; }
    public string Y { get; }
}

它將生成:

public sealed class TestClass : IEquatable<TestClass?>
{
    public TestClass(int x, string y)
    {
        X = x;
        Y = y;
    }

    public int X { get; }
    public string Y { get; }

    public override bool Equals(object? obj)
    {
        return Equals(obj as TestClass);
    }

    public bool Equals(TestClass? other)
    {
        return other != null &&
               X == other.X &&
               Y == other.Y;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(X, Y);
    }

    public static bool operator ==(TestClass? left, TestClass? right)
    {
        return EqualityComparer<TestClass>.Default.Equals(left, right);
    }

    public static bool operator !=(TestClass? left, TestClass? right)
    {
        return !(left == right);
    }
}

值得指出的是,對於上面的示例 class,您實際上可以通過使用如下record來獲得相同的結果:

public sealed record TestClass(int X, string Y);

這將使用記錄的XY屬性生成GetHashCode()Equals()

鑒於上面的record ,下面的代碼:

TestClass t1 = new TestClass(1, "1");
TestClass t2 = new TestClass(1, "1");

Console.WriteLine(t1.GetHashCode());
Console.WriteLine(t2.GetHashCode());
Console.WriteLine(t1 == t2);

輸出(在我的電腦上):

-1671517974
-1671517974
True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM