這是我第一次編寫將用於大量幾何計算的小型不可變結構。我很想使用public readonly
字段而不是private field/public getter
組合。將公共只讀字段用於不可變結構而不是私有字段/公共getter對
public struct Vector4
{
public readonly float Angle, Velocity;
// As opposed to:
private float _Angle, _Velocity;
public float Angle { get { return (this._Angle); } }
public float Velocity { get { return (this._Velocity); } }
public Vector4 (float angle, float velocity)
{
// Once set in the constructor, instance values will never change.
this.Angle = angle;
this.Velocity = velocity;
}
}
它看起來更乾淨,並消除了額外的層(吸氣劑)。由於缺乏使用公共領域是不好的做法,這樣使用公共只讀領域會有什麼負面影響嗎?
請注意,我們只討論價值類型。例如,數組會暴露元素被調用代碼覆蓋。
UPDATE:
感謝所有的輸入。似乎沒有使用public readonly
字段的情況下沒有使用數據綁定等情況。在我的基準測試中,執行時間下降了70%,這是一件大事。針對.NET 4,我會希望編譯器內聯getter-only屬性。基準測試當然在發佈配置中進行了測試,沒有附加調試器。
正如@asawyer指出的那樣,這是我過去對結構所做的工作,儘管只讀是一個有趣的想法。 readonly背後的想法是它們只能通過聲明或構造函數來設置。由於結構被認爲是不可變的,所以對我來說這聽起來像個好主意。我希望能聽到某人知道他們在說什麼,以確定這是否是有效的事情:O – Kritner
@asawyer請注意,自動屬性不能用在struct構造函數中,因爲您將立即得到「The'這個對象不能在其所有字段被賦值之前使用「。因此,如果你需要一個構造函數來爲結構的屬性賦值,那麼非自動屬性就是要走的路。 –
在這種情況下,我期待.NET Framework獲得指導。框架中的結構是否使用字段或屬性?答案是屬性,所以我傾向於效仿。該框架只是真的使用字段的常量。所有其他條件相同的情況下,屬性的優勢在於能夠綁定,哪些字段不能,並且還允許您在將來更改實現而不更改接口。面向未來的方式不會受到傷害。 – jmcilhinney