-5

我开始学习运算符重载,在示例代码中我发现这两种方法是 (public override bool equals(object obj)public override int gethashcode())。我不明白它们为什么在那里,因为当我调试这个程序时,我没有看到编译器进入它们。我不知道他们在做什么,也不知道我在做什么。

有人可以帮我解释一下吗?

4

2 回答 2

1

.NET 中的大多数类型都派生自 type ,在 C# 中System.Object简单地调用。object(例如,接口没有,但是它们的实现可以。)

System.Object声明方法Equals以及GetHashCode其他成员。(注意:大小写在 C# 中很重要)。您创建的类型会自动继承这些方法。

的任务Equals是将一个对象与另一个对象进行比较。引用类型的默认实现是比较引用。如果要更改此行为,则必须重写此方法。

GetHashCode计算对象的哈希码并用于哈希表。例如类型Dictionary<TKey,TValue>HashSet<T>使用它。请参阅哈希表和字典集合类型。如果你覆盖Equals,你必须覆盖GetHashCode以及为了保持一致性。

于 2012-12-19T16:06:42.737 回答
0

最好先参考文档。

Object.Equals -> 确定指定对象是否等于当前对象。

当前实例与 obj 参数比较的类型取决于当前实例是引用类型还是值类型。如果当前实例是引用类型,则 Equals(Object) 方法测试引用相等性,并且对 Equals(Object) 方法的调用等效于对 ReferenceEquals 方法的调用。引用相等意味着被比较的对象变量引用同一个对象。

Object.GetHashCode -> 用作特定类型的哈希函数。

哈希码是一个数值,用于在相等性测试期间识别对象。它还可以用作集合中对象的索引。GetHashCode 方法适用于散列算法和数据结构,如散列表。

为什么它们会覆盖> c# 中的所有类型都派生自System.Object。它们是覆盖以提供派生类的能力,以便在需要时提供这些功能的替代/合适的实现。否则默认实现(在System.Object中应该就足够了)。

于 2012-12-19T16:14:42.963 回答