2013-11-23 33 views
0

我已經看到了獲取/設置屬性可以以兩種不同的方式使用:明確如何set和get在C#中的工作

沒有任何邏輯:

public string PublicString { get; set; } 

有了邏輯,價值傳遞給後盾領域。

private string backingString; 
public string PublicString 
{ 
    Get 
    { 
     Return backingString; 
    } 
    Set 
    { 
     If (value != 「」) 
     { 
      backingString = value; 
     } 
    }        
} 

問題:

  • 如果要執行的邏輯,你有後盾財產還是 可以做到PublicString =價值?
  • 如果您想在設置字段失敗時返回錯誤, 這樣做的最佳做法是什麼?

感謝

+2

[c#{get;組; }快捷方式](http://stackoverflow.com/questions/16752577/c-sharp-get-set-shortcut) –

回答

3

標記它的短形式上述自動創建該屬性的支持字段和一個getter和setter僅返回或設置後臺字段的值。
如果您決定手動實現getter和setter,則不需要有後臺字段。實際上,您可以實現您需要的任何邏輯(例如從另一個字段派生值)。然而,屬性獲取器和設置器是輕量級的,因爲它符合調用者的期望。如果你需要很多的邏輯我屬性,方法是一個更好的方法,應該命名,以便他們的目的傳達給調用者。
如果要在某處存儲值,則支持字段是常用方法(除非將值存儲在其他位置)。在您的示例中顯示的值(PublicString = value)將無法將值分配給屬性本身,因爲這會再次調用setter,並以無限循環結束。
如果您未能設置該值,可以通過拋出異常與調用者溝通。然而,由於屬性往往是輕量級的,它不應該是屬性拋出異常的標準場景。同樣,如果設置屬性如此複雜或者屬性的簽名不允許調用者理解如何使用該屬性(以便使用以異常結束),則方法可能是優選的方法。

+0

我對你的評論有點困惑「如果你決定手動實現getter和setter,你會不需要有後盾領域。「 - 你會如何暗示邏輯,並設置沒有後盾的價值?還是像Ondrej Janacek所描述的那樣。 –

+0

我想說的是屬性和後臺字段基本上是不相關的。屬性可以存在而沒有後臺字段,例如如果您想從您的房產中返還固定價值,例如一個永不改變的名字。但是,屬性的​​標準是它們用於發佈內部字段的值(後臺字段)。爲了支持這個「80%的情況」,有簡短的表格。 – Markus

+0

是的,這對吸氣者來說是正確的,但是有一些問題。你顯然可以讓setter沒有後臺字段,但是你不能設置那個確切的屬性,你必須設置其他任何東西或者對收到的值不做任何事情。 –

2

如果你想在二傳手邏輯,你需要一個備用場。否則,如果你想嘗試

public int Number 
{    
    set 
    { 
     Number = value; 
    } 
} 

它會在設置屬性時導致遞歸。至於第二個問題,如果您的同事或該圖書館的用戶習慣了這些屬性有時會替代方法的行爲,那麼拋出異常就可以了。就我個人而言,我不這樣做。如果屬性的設置可能會失敗我通常使其設定屬性來代替的方法,並用

/// <exception cref=""></exception> 
3

微軟已經公佈了資產的設計遵循以下原則:

http://msdn.microsoft.com/en-us/library/ms229006.aspx

關於財產的getter/setter例外:

√做,如果一個屬性setter拋出異常保留以前的值。

X AVOID從屬性獲取器中拋出異常。 屬性獲取者應該是簡單的操作,不應該有任何先決條件。如果一個getter可以拋出一個異常,它應該重新設計成一個方法。請注意,此規則不適用於索引器,我們確實希望通過驗證參數來預期異常。