财产获取者是否应该返回私人会员以外的其他价值?

时间:2011-02-17 17:03:56

标签: .net properties code-formatting

private int _myField;
public int MyField
{
  get {
   return _myField * 99;
}
set {
   _myField * value;
}
}

我见过开发人员在Getter中添加了更复杂的代码,设置了其他成员和属性等。对我来说,返回除关联成员变量之外的值会导致调试混乱。

这样更好吗?

private int _myField;
public int MyField
{
  get {
   return _myField = _myField * 99;
}
set {
   _myField * value;
}
}

还是这个?

private int _myField;
public int MyField
{
  get {
   return _myField;
}
set {
   _myField = value * 99;
}
}

3 个答案:

答案 0 :(得分:3)

这些都不好。在某些情况下,设置其他成员,执行缓存等都没有问题 - 毕竟,没有规则说属性只是由没有逻辑的成员变量支持,并且验证是非常的你想要其他逻辑的好例子。

然而,编写属性通常是一个好主意,因此获取您刚刚设置的值将给出截然不同的答案。特别是,

foo.SomeProperty = foo.SomeProperty;

几乎从不做任何有意义的事情(而在你的例子中,它会改变价值)。

(话虽如此,前两个示例的setter代码已被破坏。)

答案 1 :(得分:1)

嗯,存在属性的原因之一是你可以像这样做。属性是一种封装形式,使您能够隐藏需要向调用者隐藏的任何逻辑。

我个人的理念是,像你这样的东西很好(即简单的数据操作不会产生副作用)但是一旦逻辑变得比几行更复杂,你应该转换为指示给调用者的方法更多的事情正在发生。

答案 2 :(得分:1)

我认为你的第二个片段违反了代码的语义。使用getter不应该影响公共值 - 也就是说,你可以在getter中做任何你想做的事情,比如缓存或延迟初始化等等 - 但在外部,对getter的两次连续调用应该返回相同的结果。