繁体   English   中英

C# 中 Java Objects.hash 和 Objects.hashCode 的等价物

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

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

事实上,我可以调用GetHashCode并将它们组合起来,如Concise 方式所示组合字段哈希码? ,但这需要对引用类型进行大量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;
    }
}

注意:我不是在寻找兼容的结果(因为我知道哈希码对于类似的对象会有所不同,即使在同一框架的版本/平台之间也可能有所不同),而是代码大小和简洁的方式。

.NET 的等效项是新的System.HashCode ,特别是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 上运行,则必须自己实现哈希码计算。 这里记录了这样做的好方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM