2015-04-30 23 views
2

我正在閱讀一個關於StackOverflow here上不純方法的問題,它讓我思考了結構設計的最佳實踐。應該C#結構只有只讀屬性

讀取有關創建不可變結構的示例here屬性僅限於獲取者。

public DateTime Start { get { return start; } } 
public DateTime End { get { return end; } } 
public bool HasValue { get { return hasValue; } } 

其他地方的例子包括System.Drawing.Point這些屬性有getter和setter。

public int Y { 
    get { 
     return y; 
    } 
    set { 
     y = value; 
    } 
} 

design guidelines沒有指定,但它們非常簡潔。結構屬性的推薦方法是什麼?只讀或允許寫入?

+2

設計指南* do *指定:「不定義可變值類型」。對我來說似乎很清楚。 –

+2

閱讀您鏈接的指南的第二點。這非常簡單。 – Servy

+0

參見http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil?rq=1 –

回答

5

的設計準則是對這個很清楚:

X沒有定義可變的值類型。

可變值類型有幾個問題。例如,當一個屬性getter返回一個值類型時,調用者會收到一個副本。因爲副本是隱式創建的,所以開發人員可能不知道它們正在變更副本,而不是原始值。此外,某些語言(尤其是動態語言)在使用可變值類型時會遇到問題,因爲即使是取消引用的局部變量也會導致副本的產生。

至於System.Drawing.Point,有足夠重要的是要打破這一設計原則的其他因素(如性能)。請參閱Why are System.Drawing Rectangle, Point, Size etc mutable structs and not classes?

+0

鏈接的問題是黃金。謝謝! –

0

結構通常應該嘗試表現爲不可變對象或用膠帶粘在一起的一堆變量(例如點的座標)。這是兩種不相關的使用模式,MSDN指南適用於第一種,但不適用於第二種。

前一種結構的所有屬性應該是隻讀的;後一種結構應該通過公共領域公開其全部狀態,但是可以完全合理地提供「便利」屬性,這些「便利」屬性基於公共字段的內容以定義的方式計算。例如,Rectangle可能具有字段X,Y,WidthHeight以及便利性RightBottom。這些屬性不會公開已經不能通過公共字段直接訪問的功能,但會允許更方便地實現一些使用模式。