我在想,什么是良好的实践:
private int value;
public int Value { get { return this.value; } }
private int DoSomething()
{
return this.Value + 1;
//OR
return this.value + 1;
}
因此,问题是关于您应该如何处理您的类变量。您应该通过属性访问它们还是直接访问?
我在想,什么是良好的实践:
private int value;
public int Value { get { return this.value; } }
private int DoSomething()
{
return this.Value + 1;
//OR
return this.value + 1;
}
因此,问题是关于您应该如何处理您的类变量。您应该通过属性访问它们还是直接访问?
在这种情况下,这并不是很重要,但是当您使用延迟加载变量时,这将非常重要,并且您需要通过属性进行访问。例如:
private Myobject _value;
public Myobject Value
{
get
{
if (_value == null) _value = new MyObject();
return _value;
}
}
private MyObject DoSomething();
{
//If you access _value here, it might be null...
//so you should access it through the property:
return Value;
}
这是标准之争的焦点。通常情况下,这不会有太大的影响,我只是在类内直接访问变量,除了 getters 和 setters 之外,它们执行的操作超出了仅仅获取或设置值。
问题在于你必须知道 getters 和 setters 在做什么,或者你必须始终将它们限制为简单操作而没有其他功能。
属性被引入来“隐藏”比从字段返回单个值更复杂的结构。
我建议您在所有代码中使用属性而不是字段,这样如果属性代码以后变得更加复杂,您就不需要重构类的其余部分。
我认为这不是一个非黑即白的问题。有几件事情需要考虑:
首先,如果属性没有行为(即get/set只是通过获取和返回字段),那么将该字段变成自动属性并消除困境。代码行数更少,没有混淆。
其次,如果属性具有副作用(延迟加载、更改通知、统计信息收集等),则必须考虑是否适合通过私有更新触发该行为。如果适当,就使用该属性。如果不适当,则不要使用(或更改设计使其更明显)。
此外,在适当的情况下,您始终可以引入包装器类型以消除混淆,如果这非常重要。
例如,假设您有一个由参数检查保护的角度属性。
public class ManThatCanRotate
{
public int Angle
{
get { return m_angle; }
set { if(value >= 0 && value < 360) m_angle = value; }
}
public void RotateLikeSomeKindOfLunatic()
{
// imagine this has been called 359 times already.
m_angle++; // ruh-roh
}
}
如果您直接设置m_angle,将会发生不好的事情(tm);角度将变得无效。您可以将角度重构为自己的类型,以使其不可能无效,从而消除问题。
我投票支持返回 this.value + 1。
反对这种方法(即通过属性)的论点是,您可能希望稍后向属性方法添加额外的代码,因此如果您这样做,需要进行的更改较少。但我认为属性应该只按照广告所说的那样做,不多不少;也就是说,它们应该尽力返回该值。