我喜欢C#中自动实现的属性,但最近有这只大象站在我的小隔间里,我不知道该如何对待他。
如果我使用自动实现的属性(以下称“aip”),那么我不再需要内部使用的私有支持字段。这很好,因为aip没有副作用。但是如果稍后我需要在get或set中添加一些额外的处理呢?
现在我需要创建一个支持字段,这样我就可以扩展我的getter和setter。这适用于使用该类的外部代码,因为它们不会注意到差异。但是现在所有对aip的内部引用都会在访问属性时调用这些副作用。现在,必须重构对ate aip的所有内部访问才能使用后备字段。
所以我的问题是,大多数人都做了什么?您是使用自动实现的属性还是更喜欢始终使用后备字段?您对具有副作用的属性有何看法?
答案 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;}}
我认为总是对后者来说是不必要的混乱。