2012-11-21 244 views
-1

我讀了一篇關於Auto Properties的zillion文章,無法想出一個不像下面例子那樣的理由。我在這裏錯過了什麼;在這個例子中是否有任何理由使用常規屬性?我經常做,它工作正常。C#自動屬性設置

在StackOverflow的另一個線程(C#3.0 Automatic properties with extra logic)中,答案被聲明爲否,如「不,自動實現的屬性沒有聲明的實現。您希望提供的任何擴展實現必須使用常規屬性。 「

class Foobar 
{ 
    public string Description { get; set; } 
    public bool Scary { get; private set; } 

    public void Describe(int size) 
    { 
     if (size <= 3) 
     { 
      switch (size) 
      { 
       case 1: 
        Description = "Cute"; 
        Scary = false; 
        break; 
       case 2: 
        Description = "Interesting"; 
        Scary = false; 
        break; 
       case 3: 
        Description = "Interesting"; 
        Scary = false; 
        break; 
      }     
     } 
     else if (size > 4 && size < 10) 
     { 
      Description = "I'm sweating!"; 
      Scary = true; 
     } 
     else 
     { 
      Description = "I'm outta here - every man for himself"; 
      Scary = true; 
     } 
    } 
} 
+0

您發佈的代碼對我來說看起來很好。我認爲其他線程只是說「如果你添加邏輯到自動屬性,他們不再是自動的。」 – StingyJack

+0

我無法理解你的問題你關心的是什麼想法/概念。 –

+0

我不明白問題所在。 – MikeSW

回答

2

你不添加代碼爲您的屬性get/set方法,您要添加到使用了get/set屬性類的完全獨立的方法。

如果有人直接使用DescriptionScary的設置方法,而不是使用Describe,則不執行定製邏輯。舉個例子,沒有什麼能夠阻止某人做:obj.Describe(10); obj.Description = "Cute";。如果你爲這些屬性重載set方法,可以防止某人創建這樣一個可愛而可怕的對象。

你已經鏈接到的問題的答案是完全正確的;您無法將驗證添加到自動實現的屬性的get/set方法;如果你想要你需要明確定義get/set方法。

+0

我同意,'Description'的setter也應該是私有的。 – Khan

+0

@Jeff還要注意,向setter添加邏輯還可以防止它在類定義的其他方法中被錯誤地使用。這可能會或可能不會令人滿意。 – Servy

+0

謝謝Servy。假設你是正確的,那是我讀過的第一個解釋對我來說很有意義。 – GDB

1

您發佈的代碼使用自動實現的屬性,並沒有問題。

明白,在邏輯上是很重要的,你的自動性質是一樣的:

private string _description; 
public string Description 
{ 
    get { return _description; } 
    set { _description = value; } 
} 

private bool _scary; 
public bool Scary 
{ 
    get { return _scary; } 
} 

我想了解這是理解爲什麼「任何你希望提供擴展的實施將有關鍵使用一個普通的財產。「

自動屬性只能在邏輯上等同於上面的內容。換句話說,自動屬性就是它的原理。這是一個等效於上面代碼的簡寫。

所以,如果你想在你的屬性中包含額外的或不同的邏輯,那麼你不能使用自動屬性。

例如,你的類可以進行重構(還記得「可能」並不意味着「應該」)廢除了Describe方法一起,封裝了所有你的邏輯到屬性:


class Foobar 
{ 
    private int _size; 

    public string Description 
    { 
     get 
     {  
      if (_size == 1) 
      { 
       return "Cute"; 
      } 
      else if (_size < 4) 
      { 
       return "Interesting"; 
      } 
      else if (_size < 10) 
      { 
       return "I'm sweating!"; 
      } 
      else 
      { 
       return "I'm outta here - every man for himself"; 
      } 
     } 
    } 

    public bool Scary 
    { 
     get 
     { 
      return _size > 3; 
     } 
    } 

    public Foobar(int size) 
    { 
     _size = size; 
    } 
} 

但是如果你這樣做了,你不能使用自動屬性,因爲你需要更多的邏輯而不僅僅是一個簡單的get/set。

如果你只是在學習何時/如何使用自動屬性,那麼我會建議始終寫出「正常」屬性。然後,如果您發現自己只是簡單地獲取/設置備份變量,那麼您可以重構使用自動屬性。