2012-03-10 18 views
11

我知道使用自動屬性時,編譯器會在屏幕後面創建自己的後臺字段。然而,在許多程序中,我讀了,我看到人們學會明確寫入有或沒​​有後場的自動屬性 ​​- 偏好?

private int _backingField; 

public int Property { get { return _backingField; } } 

是什麼區別上方與下方?

public int Property { get; private set; } 

我的理解是其明顯的使用屬性,當你確實有在getter或setter的副作用,但是這往往並非如此。另外,我知道你必須在結構的情況下明確地使用後臺字段,你不能通過屬性訪問他們的成員。

我一直能找到的唯一區別是調用該值的方式在它定義的類內部是不同的。它是簡單的首選項,還是有更多通過其屬性調用值或通過直接訪問該字段? 簡單的約定?

回答

14

這兩個片段之間沒有太大區別 - 例如,您不能通過引用傳遞屬性,但這很少是問題。但是,如果您希望字段是隻讀的,就像這樣:

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

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

這是相當混亂,順便說一句:

而且,據我所知,你必須明確地使用結構的情況下,支持字段,則無法通過屬性訪問他們的成員。

你是什麼意思?你可以肯定地使用結構中的屬性。你說的是備份領域,其可變的結構,即區別:

foo.someField.X = 10; 

foo.SomeProperty.X = 10; 

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

+1

以XNA的Vector2爲例,如果我說 public Vector2 TheVector {get;組; } 我不能打電話 TheVector.X = 10; 相反,我必須使用實際的字段。關於通過價值/參考的事情。 (你有一些閱讀材料,澄清通過值/參考C#,作爲旁註?) – Taelia 2012-03-10 11:18:55

+0

另外,如果我的兩個例子之間真的沒有區別,爲什麼這麼多人仍然明確地創建一個後場(沒有真正的目的)? – Taelia 2012-03-10 11:22:10

+0

@Taelia:對,這就是我可以避免的可變結構。這是因爲該屬性返回值的一個副本。而且我不會試圖說出其他人做什麼的理由。 – 2012-03-10 11:24:05

相關問題