C# 中 Java Objects.hash 和 Objects.hash 代码的等效项

What is equivalent for Java Objects.hash and Objects.hashCode in C#

从 Java 转为 C# 开发人员。在 Java 中,我使用了很多 Objects.hash(array) and Objects.hashCode(object) 来在 hashCode 函数中构建对象的哈希码。我在 C# 中找不到这些函数的任何等效项。有什么想法吗?

事实上,我可以调用 GetHashCode 并将它们组合起来,如 Concise way to combine field hashcodes? 所示,但这需要对引用类型进行大量 null 检查,这使得代码比可比代码长得多Java代码。

在Java中:

public class MyObject {

    private Integer type;
    private String[] attrs;
    
    @Override
    public int hashCode() {
        int hash = 1, p = 31;
        hash = p * hash + Objects.hashCode(type); // Handle Null case
        hash = p * hash + Objects.hash(attrs); // Handle Null case
        return hash;
    }
}

在 C# 中:

public class MyObject {

    private int? type;
    private string[] attrs;
    
    public override int GetHashCode()
        int hash = 1, p = 31;
        hash = p * hash + hash_of(type);    // Any utilities?
        hash = p * hash + hash_of_array(attrs); // Any utilities?
        return hash;
    }
}

注意:我不是在寻找兼容的结果(因为我知道哈希码对于相似的对象会有所不同,甚至在同一框架的 versions/platform 之间也可能不同),而是代码大小 &简洁的方式。

与此等效的 .NET 是新的 System.HashCode, in particular the HashCode.Combine<> 方法,您可以使用该方法从多个值创建哈希码:

public class MyObject
{
    private int? type;
    private string[] attrs;

    public override int GetHashCode()
        => HashCode.Combine(type, attrs);

    // remember to also override Equals
}

请注意,此类型仅在 .NET Core 中可用。如果你是 运行 .NET Framework,你将不得不自己实现哈希码计算。好的方法是 documented here.