![](/img/trans.png)
[英]StringComparer.InvariantCultureIgnoreCase Equals vs GetHashCode disagree for equal objects
[英]Automatically generating natural Equals and GetHashCode functions for objects
我發現自己在創建類時經常重寫Equals和GetHashCode函數。 這似乎是浪費時間,因為大多數時候我的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);
這將使用記錄的X
和Y
屬性生成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.