我正在阅读肯特·贝克(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);
}


*=运算符以其原始形式修改了调用_amountDollar类实例的Times变量。删除=会更改操作,以便仅读取_amount变量的值并将其用于计算中。

关于c# - 美元对象错综复杂,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30537565/

10-13 06:54