使用get时更改对象状态

时间:2015-02-04 09:00:53

标签: c# class

当我发现这个时,我正在微软网站上阅读,有人可以解释为什么这是错误的编程,因为我看到它在更少的编码行中做更多的事情。我还是班上的新手...

使用get访问器更改对象的状态是一种糟糕的编程风格。例如,以下访问器会产生每次访问数字字段时更改对象状态的副作用。

private int number;
public int Number
{
    get
    {
        return number++;   // Don't do this
    }
}

3 个答案:

答案 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,您在其中提供您已限制供用户使用的集合(数量)的大小,但您允许用户查看集合中有多少内容/项目。
现在必须在三个不同的地方得到计数 - 在这种情况下,你每次得到它都会增加数量,这是绝对错误的。
希望你明白这一点,为什么它的编程风格很差。