2016-05-10 61 views
2
  • 什麼時候應該重寫帶有類屬性的ToString()方法以及何時使用字段?
  • 只有一種方法有效或兩者都有?
  • 如果兩者都可以,我們應該在哪種情況下使用每種方法?用屬性或字段覆蓋ToString()方法?

    public override string ToString() 
    { 
        return String.Format("{0},{1}", this.field1, this.field2); 
        // ..or 
        return String.Format("{0},{1}", this.Property1, this.Property2); 
    } 
    

請幫忙???

回答

1

顯然,當你想要返回一個你準備好的字符串時,你應該重寫ToString方法。這不是一個願望。

  • 兩種方式都可以,但強烈建議使用屬性,因爲您將對控制返回值有更多的控制權。
2

兩者都可以接受。

但是,有一點需要考慮的是,屬性通常被公認爲「面向公衆」,而字段通常被大多數C#開發人員視爲「私有」。

因此,如果您希望能夠針對未直接修改的內部值調用.ToString(),請使用字段(並將其保留爲專用字段)。如果你對它們進行了外部修改並且通過.ToString()返回了那些外部修改的值,那麼請使用屬性。

最後,如果您在返回屬性值之前需要對屬性值執行任何其他「邏輯」操作,則屬性將更可取,因爲您可以在屬性的getter中對其進行修改。

+0

這與修改的值有什​​麼關係?使用屬性的實現僅使用getter,並且屬性可能是隻讀的。 – juharr

+0

@juharr如果通過構造函數設置屬性然後再進行修改會發生什麼?這會改變預期的行爲,並且不可能用現場方法(無反射)。有可能這些屬性不是隻讀的......問題中沒有足夠的細節來說明。關鍵是要正確封裝行爲並避免意想不到的副作用。它可能相關也可能不相關,這就是我爲什麼要這樣說的原因。 –

+0

好的,所以從所有的答案中,我明白這兩種方式實際上都是可能的,但在特殊情況下選擇哪種方式完全取決於程序中類功能的方式。感謝您對此問題的關注!我還不能投票給最好的答案,因爲我太新了..乾杯! – CSharp4eto

0

通常,屬性代表字段,例如,

// Property1 represent field1 
    public String Property1 { 
    get { 
     if (null == field1) 
     return "[empty]"; // <- more readable 

     return field1; 
    } 
    } 

,這就是爲什麼性質往往更可讀因此,IMHO,優選的;然而,田地也是一個不錯的選擇(尤其是如果沒有財產籠罩田地)。

// Terse C# 6.0 syntax 
    public override string ToString() { 
    return $"{Property1},{Property2}"; 
    } 
0

如果getter包含一些邏輯,例如,它使用字段的值來計算結果,然後使用屬性。作爲你的類的用戶,如果我使用了ToString(),我會驚訝地發現UI中有不同的值(如果我直接使用屬性)和堆棧跟蹤。

編輯:默認情況下,類不應提供公共的或受保護的實例字段。所以我建議你避免在ToString()中使用字段,因爲你可能會暴露一些敏感數據或不正確的對象狀態。