在所有者类中使用属​​性vs后备字段

时间:2010-03-16 18:21:43

标签: c# properties automatic-properties

我喜欢C#中自动实现的属性,但最近有这只大象站在我的小隔间里,我不知道该如何对待他。

如果我使用自动实现的属性(以下称“aip”),那么我不再需要内部使用的私有支持字段。这很好,因为aip没有副作用。但是如果稍后我需要在get或set中添加一些额外的处理呢?

现在我需要创建一个支持字段,这样我就可以扩展我的getter和setter。这适用于使用该类的外部代码,因为它们不会注意到差异。但是现在所有对aip的内部引用都会在访问属性时调用这些副作用。现在,必须重构对ate aip的所有内部访问才能使用后备字段。

所以我的问题是,大多数人都做了什么?您是使用自动实现的属性还是更喜欢始终使用后备字段?您对具有副作用的属性有何看法?

5 个答案:

答案 0 :(得分:6)

Eric Lippert has an excellent blog post回答了这个问题:

  

如果是有动机的原因   从自动实施改变   要明确实现的属性   属性是改变语义   然后你应该的财产   评估是否需要语义   从访问该物业时   在课堂上与或相同   与所需的语义不同   从访问该物业时   课外。

     

如果调查的结果是   “从课堂内,所需的   访问此属性的语义   与期望的不同   访问该属性的语义   从外面“,然后你的编辑有   介绍了一个bug。你应该修复   错误。如果它们是相同的,那么你的   编辑没有引入错误;保持   实施相同。

答案 1 :(得分:3)

首先,属性getter不应该有副作用。情况并非总是如此,但你应该有充分的理由不这样做。

也就是说,获取一个属性的引用列表是微不足道的。如果您更改为显式属性并希望您的私有代码访问新的支持变量,那么这应该是一个相当容易的修改。

答案 2 :(得分:1)

我认为使用自动实现的属性没有任何问题。想象你有一些财产:

public string Name 
{
    get; set;
}

如果您将来需要一些额外的处理,只需修改您的财产:

private string name;

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

答案 3 :(得分:0)

在将命令与问题分开方面,具有副作用的属性并不是那么好。我希望我的对象能够以同样的方式回答问题,只要我没有调用任何明确说明某些内容可能发生变化的方法。

答案 4 :(得分:0)

在我需要支持字段之前,我总是使用AIP。交换并不是很困难:

public string MyString{get;set;}

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

我认为总是对后者来说是不必要的混乱。