2012-04-20 94 views
2

我應該使用哪種場景改變類的方法裏面私有字段/屬性:正確使用的字段被封裝在屬性的類內

public class Example 
{ 
private int intVar = 0; 
private string stringVar = string.Empty; 

public int IntVar 
{ 
    get { return this.intvar; } 
    set { this.intvar = value; } 
} 

public string StringVar 
{ 
    get { return this.stringVar ; } 
    set { this.stringVar = value; } 
} 

private void SomeMethod() 
{ 
    //change fields in this way: 
    this.intVar = 50; 
    this.stringVar = "changed"; 
    //or that way(through properties): 
    this.IntVar = 50; 
    this.StringVar = "changed"; 
} 
} 

也許在這個例子中它沒有什麼區別,但如果有人爲屬性添加額外的代碼,並通過屬性更改字段會改變一些其他的東西?

你能說哪種方式更好,或者它沒有什麼區別嗎?我知道自C#3.0以來,我可以編寫自動實現的屬性,但這是C#2.0。

+3

只是一個方面的評論 - 這通常是一個壞主意,只有大寫字母的名稱和屬性不同。常見的約定是命名字段_intVar和_stringVar,並且避免錯誤類型調用錯誤的可能性,或者更糟糕的是,如果你從'IntVar'中'返回IntVar',就會得到StackOverflowException。 – 2012-04-20 09:55:08

+0

+1感謝提示 – adams 2012-04-20 09:59:44

+0

但[根據微軟](http://msdn.microsoft.com/en-us/library/ta31s3bc(v = vs.71).aspx),我們也不應該使用前綴字段名稱。 – Botz3000 2012-04-20 10:03:55

回答

1

我會說使用屬性通常更好。如果getter和setter很簡單,無論如何它們可能會在運行時被抖動內聯。正如你所說,也許會對財產代碼進行其他更改。

一個常見的變化是通過實施INotifyPropertyChanged添加更改通知。然後,如果您直接設置字段,則聽衆不會收到通知。

我更喜歡我的類使用自己的公共接口,而不是內部。對我來說,例外是我明確不想要任何副作用。儘管如此,情況很少。

0

它沒有任何區別,是個人喜好。
我更喜歡使用這些屬性。

+2

當你稍後向setter添加驗證時,它會有所作爲。 – 2012-04-20 09:55:06

1

根據我的經驗,請始終使用屬性,並且不要嘗試直接訪問您的var。 如果將來有人向屬性訪問器添加代碼,它是否負責檢查其更改的副作用。

在這種情況下,您將促進測試工作。變更實現者只需要檢查公開名稱而不是內部變量。

1

如果您進行某種驗證,例如當intVar超過100值時將Example對象標記爲無效,那麼您應該使用屬性。

public int IntVar 
{ 
    get { return this.intvar; } 
    set 
     { 
     if (value > 100) 
      // handle this corner case 
     else  
      this.intvar = value; 
     } 
} 

比方說,你的私有方法做了一些計算

private void SomeMethod() 
{ 
    int result = ...; 
    IntVar = result; 
} 

當的someMethod被稱爲是更好地在這裏使用的屬性,因此該屬性將處理驗證,因爲現場無法做到這一點。

+0

這是我在問題中提到的額外代碼的示例。 – adams 2012-04-20 10:38:53