当我发现这个时,我正在微软网站上阅读,有人可以解释为什么这是错误的编程,因为我看到它在更少的编码行中做更多的事情。我还是班上的新手...
使用get访问器更改对象的状态是一种糟糕的编程风格。例如,以下访问器会产生每次访问数字字段时更改对象状态的副作用。
private int number;
public int Number
{
get
{
return number++; // Don't do this
}
}
答案 0 :(得分:3)
...当然
大多数开发人员将Get读取为只读操作,阅读代码的人不会期望Get属性修改任何数据。这是一个惯例,但是当你想到它时,一个有意义的 - 它有助于我们所有人理解彼此的代码。
在您引用的示例中,一种方法是将其转换为两个调用 - 一个get,后跟一个集合来增加变量......另一种方法是实现一个方法来增加变量并返回结果。
答案 1 :(得分:2)
有完全有效的理由来修改get访问器上对象的状态,以及它被允许的原因(例如,出于统计目的):
例如:
private int _timesMyCustomerWasAccessed;
private Customer _myCustomer;
public Customer MyCustomer
{
get
{
_timesMyCustomerWasAccessed++;
return _myCustomer;
}
}
也就是说,通常不好的做法是对对象进行状态更改,影响如何从外部观察此对象(如果更改适用于该结果,则更糟糕的是非常相同的财产)。
这是一个语法问题: get 访问者不应该有副作用,因为它们看起来很奇怪并且使代码难以理解。
在您的示例代码中。想象一下这段代码访问该属性:
Console.Write(String.Format("{0} {1} {2},
myObject.Number,
myObject.Number,
myObject.Number));
输出结果为:
0 1 2
如果您尝试阅读该代码,除非对象的副作用已完整记录,那么您认为myObject.Number
每次会产生不同的结果会是什么?
对于你的特定情况,如果你有一个方法会更有意义:
public int GetNumberAndIncrease()
{
return number++;
}
当你阅读该代码时:
Console.Write(String.Format("{0} {1} {2},
myObject.GetNumberAndIncrease(),
myObject.GetNumberAndIncrease(),
myObject.GetNumberAndIncrease()));
只需阅读该代码即可完全理解输出
答案 2 :(得分:0)
如你的例子所示,让我们假设一个情况
您正在开发一个API,您在其中提供您已限制供用户使用的集合(数量)的大小,但您允许用户查看集合中有多少内容/项目。
现在必须在三个不同的地方得到计数 - 在这种情况下,你每次得到它都会增加数量,这是绝对错误的。
希望你明白这一点,为什么它的编程风格很差。