创造GetHashCode方法在C#
-
19-09-2019 - |
题
什么是最好的方式来创建自己的GetHashCode方法一类C#?假设我有一个简单的类(其复盖等方法),如下:
class Test
{
public string[] names;
public double[] values;
public override bool Equals(object obj)
{
return (obj is Test) && this.Equals((Test)obj);
}
public bool Equals(Test t)
{
return names.Equals(t.names) && values.Equals(t.values);
}
}
我应该使用的默认代码GetHashCode方法?
public override int GetHashCode()
{
return base.GetHashCode();
}
我应该基础的方法在内容上我的课?
public override int GetHashCode()
{
return names.GetHashCode() + values.GetHashCode() ;
}
或者我应该做些别的事情?
解决方案
System.Array
不会覆盖GetHashCode
或Equals
,因此它们使用参考平等。所以,你不应该给他们打电话。
要实现GetHashCode
,请参阅这个问题。
要实现Equals
,使用 SequenceEqual
一>扩展方法。
修改:基于.NET 2.0中,你必须写自己的SequenceEqual
的版本,像这样的:
public static bool SequenceEquals<T>(IList<T> first, IList<T> second) {
if (first == second) return true;
if (first == null || second == null) return false;
if (first.Count != second.Count) return false;
for (int i = 0; i < first.Count; i++)
if (!first[i].Equals(second[i]))
return false;
return true;
}
您可以写它采取IEnumerable<T>
代替IList<T>
,但它会有点慢,因为它不能够,如果参数具有不同的尺寸提前退出。
其他提示
,以确保您保持.GetHashCode(的覆盖它是非常重要的)的步骤的有.Equals()。
基本上,你必须确保他们认为相同的字段,以便不违反第一的GetHashCode的三个规则(从的 MSDN object.GetHashCode())
如果两个对象的比较结果为相等,则 GetHashCode的方法为每个对象 必须返回相同的值。然而, 如果两个对象不作为比较 相等,则方法的GetHashCode为 两个Object不必返回 不同的值。
在换句话说,你必须确保每次.Equals考虑两个相等的情况下,他们也将有同样的.GetHashCode()。
正如有人提到人在这里,这个问题细节方面有着出色的实现。 如果你有兴趣,我写了一些博客文章查处的散列码去年年初。你可以找到我的随笔这里(第一博客条目我关于这个问题写)
有一个良好的讨论的问题 在这里,, 和最近的更新指 BaseObject抽象的类 提供SharpArchitecture.
如果你想要更多的东西 特设, 我已经找到代码,ReSharper产生于平等()和GetHashCode()被罚款。