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

我喜欢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;}} 

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