C# · 12月 27, 2021

在C#中创建GetHashCode方法

为C#中的类创建自己的GetHashCode方法的最佳方式是什么?假设我有一个简单的类(覆盖Equals方法),如下所示: 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,请参阅this question.

要实现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>但是它会稍微慢些,因为如果参数具有不同的大小,它将不能提早退出.