C# 中的 Java Objects.hash 和 Objects.hashCode 等效于什么



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

事实上,我可以调用GetHashCode并按照简洁的方式组合它们来组合字段哈希码?,但这需要对引用类型进行大量null检查,这使得代码比类似的 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上运行,你必须自己实现哈希代码计算。此处记录了执行此操作的好方法。

最新更新