2017-02-28 58 views
2

我的講師告訴我們要使用私人領域和公共財產。最近,我正在觀看教程視頻。演示者僅創建屬性。使用該物業可以嗎?可以跳過私人字段,只使用C#中的屬性嗎?

+0

其精美絕倫使用性能沒有私人領域。他們被稱爲自動屬性。專用字段特別有用,當您希望在將值設置爲專用字段之前或之後以及在返回專用字段的值之前在getter和setter中執行任何額外邏輯時。 –

+0

相關:http://stackoverflow.com/q/1277572/380384 – ja72

+1

此外,很高興能夠做到這樣一個屬性:'public int MyValue {get;私人設置; }'現在'MyValue'是一個公共屬性,只能在類中設置。 – txtechhelp

回答

5

公共屬性,如

public string Name { get; set; } 

自動實現由編譯器專用支持字段。你永遠不會看到它們,但效果與手動指定的後臺字段相同。

private string name; 
public string Name { get { return name; } set { name =value; } } 
+1

因此,C#3.0及以後的答案是**是的** –

+0

'C#3.0'和Visual Studio 2008已被棄用,所以我沒有理會澄清。我想知道是否有那些仍然堅持使用.NET 3.5的類 – ja72

-1

是的,可以使用沒有私人領域的公共財產,但只是使用公共領域是不好的。原因是你有能力改變你在後面驗證和存儲字段的屬性,而只是公共字段改變會破壞你的類的任何用戶。關鍵的區別在於,對於屬性,您仍然可以控制類的內部狀態,即使這是自動生成的字段,而使用公有字段則不然。

3

對於.Net framework 2.0少,私人領域是必要的,否則你將得到編譯錯誤。

在更高版本的.Net Framework,它將正常工作,沒有任何錯誤。

使用私有字段不正確的值

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

將其分配給屬性

public int Max 
{ 
    get { return m_Max; } 
    set 
    { 
     if (value>0 && value<100) 
     { 
      m_Max=value; 
     } 
    } 
} 
  • 觸發例外之前有很多優點

    1. 驗證輸入

      1. 如果屬性setter引發異常,則保留以前的值。

      2. AVOID從屬性獲取器拋出異常。如果一個getter可以拋出 異常,它或許應該被重新設計爲一個方法

      public int Max 
          { 
           get { return m_Max; } 
           set { 
            if(value > 0 && value < 100){ \\Value is within valid range 
             m_Max = value; 
            } 
            else if(value < 0) 
             //throw some exception to indicate value is not valid 
            else if(value > 100) 
             //throw some exception to indicate value is not valid 
           } 
          } 
      
  • +1

    我無法格式化我的代碼 – Kira

    +0

    屬性拋出異常(除非它是索引器)是一種不好的做法。有關更多詳細信息,請參閱[有關屬性和異常的此問題](http://stackoverflow.com/questions/1488472/best-practices-throwing-exceptions-from-properties)。簡而言之:如果你的財產可以拋出,那麼它可能應該是一種方法。在你的第二個例子中,我將保留Max的getter,但用SetMax方法替換setter。 – AnorZaken

    +0

    對於引導程序來說,它們表明異常是一種合適且可接受的錯誤處理策略。 – Kira

    相關問題