2012-11-27 25 views
1

可能重複:
Difference between Property and Field in C# .NET 3.5+
Why should I use an automatically implemented property instead of a field?當我可以使用一個屬性時,爲什麼我應該使用一個字段?

以下兩個例子都一模一樣,有內部和外部類相同的訪問寫道......那麼,爲什麼大家似乎使用例1與例2相同? 我確定我只是想念一些東西,但這一直在困擾着我一段時間,我一直無法找到明確的答案。

class SampleClass 
{ 
    /// Example 1 
    /// Shown by online examples. 
    /// Why use a Field AND a Property where you could just use Example 2? 
    private int age; 
    public int Age { get { return age; } } 
    private void setAge() 
    { 
     age = 1; 
    } 

    /// Example 2 
    /// Tidier code and better understanding of how Age2 can be accessed. 
    /// Personally I prefer this method, though am I right to use it over Example 1? 
    public int Age2 { get; private set; } 
    private void setAge2() 
    { 
     Age2 = 1; 
    } 
} 
+2

這些重複項都不是有效的。他不問他是否應該使用字段與屬性,他問的是手動實現的屬性與自動實現的屬性。 – Servy

+1

@OP還注意到自動實現的屬性是在C#3.0中引入的,但自C#1.0以來,屬性就已經在語言中。手動定義屬性的很多例子都是舊的代碼樣本,或者沒有(或尚未)習慣於較新語法的人。當然,也有一些情況下,你可以手動做些東西,但道具不能這樣做,但這不是你所發佈的例子。 – Servy

+0

這可能是我最需要努力的地方,有什麼新鮮事,什麼是更好的做法?如果示例2在早期的.NET版本中不可行,並且示例1對於達到相同的效果是必需的。通過使用示例2可以讓人放心,我使用了更現代的語法,並且不會不必要地擴展示例1中的代碼。:) – Robula

回答

0

如果我使用VS2008或更大,不需要它在VS2005編譯的,一般我使用簡寫或:

public string SomeProperty { get; set; } 

但有時你需要一個支持字段,尤其是當你實現INotifyPropertyChanged的。

private string _someProperty; 
public string SomeProperty 
{ 
    get { return _someProperty; } 
    set 
    { 
     _someProperty = value; 
     OnPropertyChanged("SomeProperty"); 
    } 
} 

但即使我確實有一個支持字段,我仍然通過屬性設置值,以保持一致性。

+0

謝謝。這不是我所做的,甚至想到的。我認爲INotifyPropertyChanged是一個當屬性發生變化時觸發事件的接口?請原諒我的缺乏經驗...... – Robula

+0

正確,在MVVM模式下使用WPF時會大量使用它。基本上用這種模式你創建一個ViewModel類並且視圖綁定到ViewModel上的屬性。視圖註冊了PropertyChanged事件,因此當ViewModel中的值更改時,View可以使用新數據更新適當的控件。 – taylorjonl

+0

謝謝你,你真的很有幫助。 :d – Robula

1

如果要在屬性setter或getter上提供任何實際功能,則必須使用後備字段。例如,如果你想對你的setter進行驗證,你將需要使用一個後臺字段。

public class MyClass 
{ 
    private string myString = "blah"; 

    public string MyNotNullString 
    { 
     get 
     { 
      return this.myString; 
     } 
     set 
     { 
      if (value == null) 
      { 
       throw new ArgumentNullException("Cannot set MyNotNullString to null"); 
      } 
      this.myString = value; 
     } 
    } 
} 
0

如果可能的話整潔的因素,每次...除非有地方,我需要一個字段,如@Platinum Azure的回答情況,我會用例題。

我能想到的例1的唯一的另一個好處是你可以在getter或setter方法中設置一個斷點,作爲找出誰正在改變值的快速方法。

+0

嗯沒關係。考慮到所有這些,我理解它的方式是Fields對於陳述類中的變量/對象是理想的。儘管屬性有一個直接的好處,我需要用適當的讀/寫訪問修飾符安全地暴露聲明類之外的變量/對象。 我在這裏的正確波長? :) – Robula

+0

哦,我沒有意識到這是一個字段與財產問題,我認爲你比較了一個自動屬性{get; set;}與一個屬性與後盾字段。那麼,理想情況下,領域應該是私人的,如果可能的話屬性使用自動道具......無論如何,這是我的承擔。 – demoncodemonkey

+0

這不是......我只是一個初學者,試圖理解我應該如何去做某些事情,包括使用領域或不使用領域。在問這個問題之前,我從未聽說過「汽車」財產。仍然不確定爲什麼我需要一個支持領域,但也許我會意識到當我的技能提高和需求增加時,需求是什麼。現在我相信我有我的答案,謝謝大家:) – Robula

相關問題