2010-04-13 76 views
10

我檢討其他開發人員的代碼,他已經寫了很多的類級變量的代碼類似於以下內容:用getter和setter聲明一個私有屬性有什麼好處嗎?

/// <summary> 
    /// how often to check for messages 
    /// </summary> 
    private int CheckForMessagesMilliSeconds { get; set; } 

    /// <summary> 
    /// application path 
    /// </summary> 
    private string AppPath { get; set; } 

不編碼這種方式增加了不必要的開銷,因爲變量是私有的?

難道我不考慮在需要的私有變量編碼的這種模式的情況?

+0

我更喜歡使用私有字段而不是私有屬性,因爲我的代碼中存在的_前綴提醒我我正在使用私有成員。如果以後我想讓它們成爲私有屬性,我只會讓Resharper做它的事情,因爲無論如何,所有引用都是本地的。 – 2010-04-13 19:51:43

+0

[私有字段和私有屬性之間的差異]的可能重複(http://stackoverflow.com/questions/411048/differences-between-private-fields-and-private-properties) – 2012-04-19 01:02:19

回答

6

專用屬性時指派的值該專用變量(其是由編譯器爲您創建)爲您提供一個抽象層。這樣做的效率並不低,如果您需要改變未來完成任務的方式,您只需要擔心在一個地方更新它。

它還可以在應用程序中提供一致性。如果所有分配都是通過屬性完成的,那麼一些可以驗證分配值,而另一些則不能。對於與財產接口的人來說,驗證和驗證者之間沒有區別。 (和這樣某人不小心將值分配給一個局部變量,其不驗證。)

+0

大部分時間JIT編譯器將優化對吸氣和呼吸者的呼叫消失了,所以我不會太在意效率。 – Steven 2010-04-13 18:48:29

1

IIRC,編譯器將優化訪問的屬性和它最終將是到自動直接引用生成後臺字段。

這將導致沒有開銷,清潔和更可維護的代碼。

+2

這將是JIT編譯器,而不是C#編譯器。 – 2010-04-13 17:50:51

9

這就像說私有方法不是有益的,因爲他們增加不必要的開銷和類外沒有人會使用它們。

屬性給你一個變量,你的代碼的其餘部分之間的聯繫點。將來,您可能需要添加錯誤檢查或更新其他值,只要變量發生變化,屬性將允許您這樣做。

+0

+1:此模式有一個名稱:**自封裝字段**。當強制執行與字段相關的規則或不變量時,它會變得重複,否則會重複並分散。這裏有一篇很棒的文章:http://sourcemaking.com/refactoring/self-encapsulate-field – LBushkin 2010-04-13 18:02:55

3

沒有,JIT編譯器將其轉換屬性訪問到直接變量訪問的支持字段,所以一點也不比直接使用一個成員變量效率較低。

優點是,如果您希望將屬性轉換爲非平凡實現,您可以將代碼添加到get/set中,以允許其他檢查或行爲或不同的存儲機制用於屬性,而無需重構任何客戶端代碼(在這種情況下,全部在同一個類中)。

3

我認爲這是一個很好的做法,習慣於使用屬性而不是字段。
由於JIT可以內聯getter和setter,所以開銷可能最小。所以雖然不一定要求,但這樣做沒有任何問題。

0

性能問題可能是微不足道或根本不存在的,但它需要你輸入9個字符(+空格)沒有收穫。如果您以後想要將字段轉換爲屬性,則無論如何都可以這樣做,因爲字段和屬性是完全源兼容的(只要您不使用可變值類型)。

0

我沒有看到任何真正的好處,但我也沒有看到任何傷害。如果您將來將該物業轉爲公共物品,可能會爲您節省一些打字費用。但是,您將私人會員轉換爲公共財產的頻率如何?而當你這樣做的時候,它可能只是一兩個項目,但是你的課程中包含很多成員。如果您要轉換爲不重要的實現或添加任何類型的驗證,則需要將自動執行屬性轉換爲具有實際後備字段的屬性,否則您可能會認爲自己在開始。

對我來說,這似乎是個人喜好的事情,沒有性能影響,以及在進行未來更改時會產生一些次要影響(積極和消極)。

相關問題