簡體   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