如果我重写ToString,我还需要重写Equals和GetHashCode吗?

时间:2011-11-05 02:18:00

标签: c# .net c#-3.0

我确信如果我重写Equals,我还需要覆盖GetHashCode,以确保Dictionary等..数据结构按预期工作。

但是如果我只想重写ToString,我还是要重写Equals和GetHashCode方法。

5 个答案:

答案 0 :(得分:8)

覆盖这三种方法有三个不同的目的:

  1. ToString:对象的输出表示。
  2. 等于:如果两个对象代表相同的东西。在其默认实现中使用GetHashCode。
  3. GetHashCode:用于索引对象。这里有几个高级主题,包括哈希值的半唯一性和分布。
  4. 如您所见,2和3是相关的,但1是分开的。除非你实现Equals以简单地测试两个对象的ToString是否相等,这很可能是一个错误。 :)

    因此,已经给出了简短的答案:您可以覆盖ToString而不会覆盖其他两个方法。甚至重载ToString方法也很正常。有关示例,请参阅DateTime:http://msdn.microsoft.com/en-us/library/zdtaw1bw.aspx

答案 1 :(得分:1)

不,您不必覆盖EqualsGetHashCode,它们与ToString

无关

答案 2 :(得分:0)

如果仅重写ToString()

,则不需要重写Equals和GetHashCode

答案 3 :(得分: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
    }
}

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

答案 4 :(得分:0)

ToString仅用于表示对象的字符串表示形式。没什么。

正如您所说,如果您要覆盖Equals,最佳做法是覆盖HashTables的GetHashCode。但是这两个操作是无关的。