當爲匿名類生成GetHashCode()
實現時,Roslyn會根據屬性名稱計算初始哈希值。例如,對於爲什麼爲匿名類生成的GetHashCode()實現中的初始哈希值取決於屬性名稱?
var x = new { Int = 42, Text = "42" };
將會有以下GetHashCode()
方法:
public override in GetHashCode()
{
int hash = 339055328;
hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode(Int);
hash = hash * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Text);
return hash;
}
但是,如果我們改變屬性名稱,初始值的變化:
var x = new { Int2 = 42, Text2 = "42" };
public override in GetHashCode()
{
int hash = 605502342;
hash = hash * -1521134295 + EqualityComparer<int>.Default.GetHashCode(Int2);
hash = hash * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Text2);
return hash;
}
這種行爲背後的原因是什麼?只是選擇一個大的[prime?]數字並將其用於所有匿名類,是否存在一些問題?
如果您使用不同的常量,以使不同類型的對象「更」不同,對我來說似乎更有用。 – usr