繁体   English   中英

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

[英]If I override ToString, do i need to override Equals and GetHashCode as well?

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

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

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

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

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

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

不,您不必重写EqualsGetHashCode ,它们与ToString无关

如果只重写ToString(),你不需要重写Equals和GetHashCode

你可以只为某个类覆盖它,或者你的意思是在每个类/对象上覆盖它?

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

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

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

ToString仅用于表示对象的字符串表示形式。 而已。

正如您所说的,如果要覆盖Equals,最好是为HashTables重写GetHashCode。 但是这两个操作是无关的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM