11

我喜欢 C# 中的自动实现属性,但最近我的隔间里站着一头大象,我不知道该怎么处理他。

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

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

所以我的问题是,你们大多数人是做什么的?您是使用自动实现的属性还是更喜欢始终使用支持字段?您如何看待具有副作用的属性?

4

5 回答 5

6

Eric Lippert 有一篇优秀的博客文章回答了这个问题:

如果促使从自动实现的属性更改为显式实现的属性的原因是改变属性的语义,那么您应该评估从类中访问属性时所需的语义是否与访问时所需的语义相同或不同课外的财产。

如果该调查的结果是“从类内部访问此属性的所需语义与从外部访问该属性的所需语义不同”,那么您的编辑引入了一个错误。你应该修复这个错误。如果它们相同,那么您的编辑没有引入错误;保持执行相同。

于 2010-03-16T18:24:58.803 回答
3

首先,属性获取器不应该有副作用。情况并非总是如此,但你应该有一个很好的理由让它不是这样。

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

于 2010-03-16T18:27:44.680 回答
1

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

public string Name 
{
    get; set;
}

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

private string name;

public string Name 
{
    get { return this.name; }
    set 
    {
       if (!string.IsNullOrEmpty(value))
       { 
           this.name = value;
       }
    }
}
于 2010-03-16T18:26:23.293 回答
0

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

于 2010-03-16T18:26:24.753 回答
0

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

public string MyString{get;set;}

为了

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

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

于 2010-03-16T18:26:49.150 回答