2008-12-10 57 views
3

這是我不太一致,總是好奇別人在做什麼。通過訪問器或直接訪問同一類的屬性的最佳方式是什麼?

你如何訪問內部屬性(私人或公共)?

例如你有這個屬性:

Private _Name As String 

Public Property Name() As String 
    Get 
     Return _Name 
    End Get 
    Set(ByVal value As String) 
     _Name = value 
    End Set 
End Property 

在另一個函數內的同一類你更喜歡哪一個?爲什麼?

_Name = "Johnny" 

Name = "Johnny" 

忽略,我用來代替Me.Name名稱的事實。

+0

[您是否應該通過屬性訪問同一類中的變量?](http://stackoverflow.com/questions/271318/should-you-access-a-variable-within-the-相同的類通過一個屬性) – nawfal 2013-06-04 06:15:28

回答

12

我個人更喜歡在可能的情況下使用該物業。這意味着您仍然可以進行驗證,並且您可以輕鬆地在屬性訪問上放置斷點。這個不是你試圖對兩個互相驗證的屬性進行更改 - 例如,「最小和最大」對,其中每個對都有一個驗證約束條件,如min <= max。你可能有(C#):

public void SetMinMax(int min, int max) 
{ 
    if (max > min) 
    { 
     throw new ArgumentOutOfRangeException("max"; 
    } 
    // We're okay now - no need to validate, so go straight to fields 
    this.min = min; 
    this.max = max; 
} 

在未來的某個時刻,我想看看C#獲得的財產中聲明的支持字段的能力,使得它的私有只是財產:

public string Name 
{ 
    string name; 

    get { return name; } 
    set 
    { 
     if (value == null) 
     { 
      throw new ArgumentNullException("value"); 
     }  
     name = value; 
    } 
} 

以外的財產,你將無法在name得到可言,只有Name。我們已經有了這個自動實現的屬性,但它們不能包含任何邏輯。

+0

投票在這裏爲上述功能:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93337 – Joe 2008-12-10 13:11:14

1

我喜歡:

Name = "Johny" 

對於我來說,原因很簡單,如果有什麼不好用_Name發生,你可以隨時把在的getter/setter一些輸出,並找出是什麼原因造成的麻煩。

2

我想說

Name = "Johnny" 

的原因是,我可能有一些驗證(或觸發,或延遲初始化,或......),或者以後可能決定插入一些驗證,指定名稱和時我想確保觸發該代碼。

0

這是挺有意思的,我想大多數的人在做什麼,我做

Me.Name = "Johnny" 

Name = "Johnny" 

然而,大多數是我見過的項目使用

_Name = "Jonny" 

風格。我認爲這是一個糟糕的主意,並且感謝你確認的答案。即使大部分由多個工具生成的自動代碼都使用直接訪問。

有沒有什麼特別的表現?或者,當沒有額外的代碼在set或get中時,編譯器會優化它。

+1

JIT將內聯微不足道的屬性,當不在調試器中運行。 – 2008-12-10 12:10:48

0

使用屬性(名稱)。我相信一個財產應該是基礎領域(_name)的唯一「所有者」。

優勢的性質下封裝領域的:

  • 可讀性:代碼只有一個區域,其中_name被改變或處理返回之前。
  • 易於設置斷點,調試等
  • DRY:就驗證和處理而言,無需重複代碼。
  • 更改彈性:更改驗證和處理不會影響使用 屬性的代碼。
相關問題