【发布时间】:2021-11-20 03:40:23
【问题描述】:
从 Java 转向 C# 开发人员。在 Java 中,我使用了很多 Objects.hash(array) 和 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;
}
}
注意:我不是在寻找兼容的结果(因为我知道哈希码对于类似的对象会有所不同,甚至在同一框架的版本/平台之间也可能不同),而是寻找代码大小和简洁的方式。
【问题讨论】:
-
.Net 中的每个对象都实现了 GetHashCode。您还要求别的吗?
-
@Amy:GetHashCode 仅带有默认实现。如果我们想将对象用作映射键或将对象放入哈希集中,我们仍然需要覆盖它。看到这个:docs.microsoft.com/en-us/dotnet/api/…
-
什么“正确”的实现? .Net 哈希码与 Java 哈希码不同。它们一直用于哈希集,没有问题。
-
为什么不一样?您对对象哈希码以及我们为什么需要它的理解是错误的......
-
你说得对,我不明白为什么默认实现适用于其他所有人,但不适用于你。
标签: c# gethashcode