2010-07-17 52 views
9

一方面,我知道屬性的建議用法是有支持字段,如下面的例子:屬性後臺 - 它有什麼好處?

private int m_Capacity; 

    public int Capacity 
    { 
     get { return m_Capacity > 0 ? m_Capacity : -666; } 
     set { m_Capacity = value; } 
    } 

在另一方面,有什麼好處我來自使用上面的例子中得到在下面的例子中丟棄場和僅使用屬性爲所有目的,如:

public int Capacity 
    { 
     get { return Capacity > 0 ? Capacity : -666; } 
     set { Capacity = value; } 
    } 

有什麼好有關使用支持字段爲常規(非自動實現)屬性?

+6

難道你不覺得你的第二個例子會導致StackOverflowExceptions嗎?你寫得對嗎?您目前正在從屬性本身引用該屬性。 – 2010-07-17 19:13:14

+1

你是對的。我沒有想到這一點,也沒有運行代碼。 – galbarm 2010-07-17 19:20:50

+2

@亞歷山大漢弗萊:..從屬性本身內的屬性本身屬性本身.. .. – maxwellb 2010-09-24 20:11:30

回答

21

如果你這樣做:

public int Capacity 
{ 
    get { return Capacity > 0 ? Capacity : -666; } 
    set { Capacity = value; } 
} 

那麼你的代碼將有無限遞歸。它永遠不會工作。這是因爲Capacity的getter正在引用自身。二傳手同樣如此。

除非你使用自動屬性,你需要一個支持字段

+1

這是一個恥辱的後盾領域不能自動;那將是真棒。 – 2016-05-29 12:03:22

2

主要是因爲你會得到一個StackOverflow。

+0

確實。這尤其會導致我記得最近在.Net代碼中看到的大多數SO。我想知道編譯警告是否合適。這個用法是否有意義? – 2010-07-17 19:14:55

+0

當呼叫遞歸時,Resharper是否在左邊空白處放置了一個小符號?我總是看到它,但我不確定這樣的事情是R#還是VS. – 2010-07-17 19:21:11

+0

可能是Resharper;我從來沒有在股票VS中見過類似的東西。 – cHao 2010-07-17 19:29:42

3

如果你需要訪問m_Capacity的實際值,而不是「管理」值你從能力得到顯式私人MEMBERID是有用財產,

編輯:其他帖子正確指出語法錯誤。我也應該提到它,但我忽略它,只是試圖回答他的問題,這似乎是關於自動屬性

+0

或者如果您需要更改容量計算方式。具有後備私有變量的屬性是一種非常簡單的解耦方法。 – 2010-07-17 19:15:07

+0

這應該是投票答案。目前接受的答案只是說你需要一個財產,但不是*爲什麼*它是需要的,這將回答OP的問題。 – 2017-11-29 22:33:04

2

不要忘記,屬性是生成getter和setter方法的簡寫語法。他們看起來像田野,但他們不是。

+0

也被稱爲「語法糖」。 – 2016-06-27 15:10:05

1

支持字段支持封裝的概念。

封裝允許您稍後更改類的實現細節而不更改其接口。

這意味着使用getter和setter而不是公共類成員的後臺字段會使您的代碼對於將來的開發人員或未來的自己更健壯和/或可讀。

相關問題