簡體   English   中英

在所有者類中使用屬​​性vs后備字段

[英]Use of properties vs backing-field inside owner class

我喜歡C#中自動實現的屬性,但最近有這只大象站在我的小隔間里,我不知道該怎么辦。

如果我使用自動實現的屬性(以下稱“aip”),那么我不再需要內部使用的私有支持字段。 這很好,因為aip沒有副作用。 但是如果稍后我需要在get或set中添加一些額外的處理呢?

現在我需要創建一個支持字段,這樣我就可以擴展我的getter和setter。 這適用於使用該類的外部代碼,因為它們不會注意到差異。 但是現在所有對aip的內部引用都會在訪問屬性時調用這些副作用。 現在,必須重構對ate aip的所有內部訪問才能使用后備字段。

所以我的問題是,大多數人都做了什么? 您是使用自動實現的屬性還是更喜歡始終使用后備字段? 您如何看待具有副作用的屬性?

Eric Lippert有一篇很棒的博客文章回答了這個問題:

如果促使從自動實現的屬性更改為顯式實現的屬性的原因是更改屬性的語義,那么您應該評估從類中訪問屬性時所需的語義是否與訪問時所需的語義相同或不同來自課外的財產。

如果調查的結果是“來自類內,訪問此屬性的所需語義不同於從外部訪問屬性所需的語義”,那么您的編輯引入了一個錯誤。 你應該修復這個bug。 如果它們是相同的,那么你的編輯沒有引入錯誤; 保持實施相同。

首先, 財產癮者不應該有副作用 情況並非總是如此,但你應該有充分的理由不這樣做。

也就是說,獲取一個屬性的引用列表是微不足道的。 如果您更改為顯式屬性並希望您的私有代碼訪問新的支持變量,那么這應該是一個相當容易的修改。

我沒有看到使用自動實現的屬性的任何問題。 想象你有一些財產:

public string Name 
{
    get; set;
}

如果您將來需要一些額外的處理,您只需修改您的財產:

private string name;

public string Name 
{
    get { return this.name; }
    set 
    {
       if (!string.IsNullOrEmpty(value))
       { 
           this.name = value;
       }
    }
}

在將命令與問題分開方面,具有副作用的屬性並不是那么好。 我希望我的對象能夠以同樣的方式回答問題,只要我沒有調用任何明確說明某些內容可能會發生變化的方法。

在我需要支持領域之前,我總是使用AIP。 交換並不是很困難:

public string MyString{get;set;}

對於

private string myString;
public string MyString{get{return myString;} set{myString = value;}}

我認為總是對后者來說是不必要的混亂。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM