返回一个双变量,同时使用c#追加它

本文关键字:追加 变量 一个 返回 | 更新日期: 2023-09-27 18:12:28

在尝试向对象数据成员返回双精度类型时,我得到了一些意外行为。

例如:

// obj.doubPoints = .25 before operation
obj.doubPoints += SomeFunction(someVar);
// SomeFunction(someVar) returns a 0, and instead it stores the value into obj.doubPoints
// So obj.doubPoints = 0, instead of the expected 0.25

我知道简单的解决办法是:

double storePoints = SomeFunction(someVar);
obj.doubPoints += storePoints;
// obj.doubPoints = 0.25 afterwards

但我只是好奇为什么它的工作方式?

编辑:我希望这能澄清问题。这是对正在发生的事情更准确的描述。
class Program
{
    static void Main(string[] args)
    {
        var obj = new Temp();
        obj.doubPoints = 0;
        obj.doubPoints += obj.SomeFunction();
    }
}
public class Temp
{
    public double doubPoints = 0;
    public double SomeFunction()
    {
        doubPoints = 0.25;
        return 0;
    }
}

返回一个双变量,同时使用c#追加它

好吧,底线是它不是那样工作的。

void Main()
{
    var obj = new Temp();
    obj.Dump();
    obj.doubPoints += SomeFunction();
    obj.Dump();
}
public double SomeFunction()
{
    return 0;
}
public class Temp
{
   public double doubPoints = .25;
}

结果均为0.25。你的输入,或者输出,或者别的什么发生了什么……我知道,不是很有用。

哇,这是一个很好的混淆自己的方法。

obj.doubPoints += obj.SomeFunction();

将展开为:

obj.doubPoints = obj.doubPoints + obj.SomeFunction();

因此,当计算该表达式时,它读取obj.doubPoints并得到0。然后它调用obj.SomeFunction,得到另一个0。即使该方法将doubPoints更改为。25,这将是在表达式中读取它之后。所以你仍然得到obj.doubPoints = 0 + 0

编辑:是的,正如ClickRick所提到的,这(很可能)不是保证行为。远离那样的东西!

编辑2:ClickRick经过一些研究后发现,这实际上是c#中保证的行为。在c++中,没有这么多。很高兴知道!

如果你想增加obj。那么SomeFunction应该这样做:

public double SomeFunction()
{
    return 0.25;
}

也可能更容易这样做:

public double SomeFunction()
{
    doubPoints += 0.25;
}

这样就不用说obj.doubPoints += obj.SomeFunction();了,可以直接说obj.SomeFunction();

看来你可能对return的作用有点困惑。这可能会有所帮助:http://msdn.microsoft.com/en-us/library/1h3swy84.aspx