如果我重写 ToString,是否也需要重写 Equals 和 GetHashCode?

5

我确定如果我覆盖了Equals方法,我需要同时覆盖GetHashCode方法,以确保字典等数据结构按预期工作。

但是,如果我只想覆盖ToString方法,我是否仍然需要覆盖Equals和GetHashCode方法呢?


参见 DebuggerDisplay 属性 - 这是覆盖 ToString 方法的一种替代方法(这取决于你想做什么)。 - TrueWill
5个回答

8

重写这三个方法有三个不同的目的:

  1. ToString:输出对象的表示形式。
  2. Equals:如果两个对象表示相同的内容。在其默认实现中使用GetHashCode。
  3. GetHashCode:用于对象的索引。这里涉及到一些高级话题,包括半唯一性和哈希值的分布。

可以看出2和3是相关的,但1是独立的。除非你实现Equals来简单地测试两个对象的ToString是否相等,否则这很可能是一个错误。 :)

所以,简短的回答已经被给出:您可以重写ToString而不重写另外两个方法。甚至重载ToString方法是非常正常的。参见DateTime的示例:http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx


Equals:如果两个对象表示相同的事物。在其默认实现中使用GetHashCode。我认为它默认使用引用,不是吗?而GetHasCode是用于分配哈希值的,不是吗? - Dreamer
嗯...你这么说听起来是正确的。我可能在那方面说得太早了。老实说,我得查一下。我想我应该去睡觉了。:) 不过最重要的是Equals不依赖于ToString,所以更改是安全的。 - Gaute Løken

2
不,您不必重写EqualsGetHashCode方法,它们与ToString没有关系。

1

如果只覆盖 ToString(),则不需要重写 Equals 和 GetHashCode。


1

ToString只是你的对象的字符串表示形式,没有其他作用。

正如你所说,如果你要重写Equals,最好也重写HashTables的GetHashCode。然而这两个操作是无关的。


0

你可以只针对某个类进行覆盖,还是说你的意思是要在每个类/对象上都进行覆盖?

public class YourClass
{
    // Other stuff here...

    public override string ToString()
    {
        // Do whatever you want here instead, or return base.ToString(); for the default behavior
    }
}

但它与其他方法无关,您可以选择要覆盖的内容


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接