簡體   English   中英

有或沒有支持字段的自動屬性 ​​- 首選項?

[英]Auto-properties with or without backing field - preference?

我知道在使用自動屬性時,編譯器會在屏幕后面創建自己的支持字段。 但是,在我讀過的許多程序中,我看到人們明確地寫了

private int _backingField;

public int Property { get { return _backingField; } }

上面和下面有什么區別?

public int Property { get; private set; }

我明白當你在getter或setter中實際存在副作用時使用該屬性是顯而易見的,但通常情況並非如此。 此外,我知道您必須在結構的情況下明確使用支持字段,您不能通過屬性訪問其成員。

我能找到的唯一區別是調用值的方式在它定義的類中是不同的。那么它是簡單的首選項,還是通過其屬性調用值或直接訪問領域? 簡單約定?

這兩個片段之間沒有太大區別 - 例如,你不能通過引用傳遞屬性,但這很少是一個問題。 但是,如果您希望該字段是只讀的,請執行以下操作:

private readonly int _backingField;    
public int Property { get { return _backingField; } }

那就有區別了。 我上面編寫的代碼可以防止在類中的其他地方更改值,從而清楚地表明這實際上是不可變的。 我真的希望能夠聲明一個只讀字段,該字段具有只讀的自動實現屬性,只能在構造函數中設置 - 但目前還不可用。

順便說一下,這很令人困惑:

此外,我知道您必須在結構的情況下明確使用支持字段,您不能通過屬性訪問其成員。

你什么意思? 你絕對可以在結構中使用屬性。 你說的是哪個備份可變的結構域,即區別:

foo.someField.X = 10;

foo.SomeProperty.X = 10;

如果是這樣,我通常通過使我的結構不可變開始避免這是一個問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM