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

Dre*_*mer 5 .net c# c#-3.0

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

但是,如果我只想重写ToString,我还是必须重写Equals和GetHashCode方法.

Mit*_*hon 8

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

  1. ToString:对象的输出表示.
  2. 等于:如果两个对象代表相同的东西.在其默认实现中使用GetHashCode.
  3. GetHashCode:用于索引对象.这里有几个高级主题,包括哈希值的半唯一性和分布.

如您所见,2和3是相关的,但1是分开的.除非你实现Equals以简单地测试两个对象的ToString是否相等,这很可能是一个错误.:)

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