返回一个双变量,同时使用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;
}
}
好吧,底线是它不是那样工作的。
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