我正在阅读肯特·贝克(Kent Beck)的书“测试驱动开发:通过示例”。在他的书中,有一个编码示例:
public class Dollar
{
public int _amount;
public Dollar(int amount)
{
_amount = amount;
}
public Dollar Times(int multiplier)
{
return new Dollar(_amount *= multiplier);
}
}
[TestMethod]
public void TestMethod2()
{
Dollar five = new Dollar(5);
Dollar product = five.Times(2);
Assert.AreEqual(10, product._amount);
product = five.Times(3);
Assert.AreEqual(15, product._amount);
}
根据肯特的说法,第二个美元对象:“产品”对于保留原始的“五个”美元对象是必需的。但是,第二个断言返回false,因为product._amount等于30。我无法在此文本上找到任何勘误。为了使第二个断言等于true或15 == 15,上述Kent的代码将如何更改?这本书的例子有缺陷吗?为什么第二个断言中的product._amount不等于15?
最佳答案
正如评论中所说,这是:
public Dollar Times(int multiplier) {
return new Dollar(_amount *= multiplier);
}
应该:
public Dollar Times(int multiplier) {
return new Dollar(_amount * multiplier);
}
*=
运算符以其原始形式修改了调用_amount
的Dollar
类实例的Times
变量。删除=
会更改操作,以便仅读取_amount
变量的值并将其用于计算中。关于c# - 美元对象错综复杂,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30537565/