我有一段代码:
using System;
public class Program
{
private static int Incr(ref int i)
{
return i++;
}
public static void Main()
{
var i = 0;
i += Incr(ref i);
Console.WriteLine(i);
}
}
Console.WriteLine(i)会给我们“0”。但是在没有“+ =”的情况下调用Incr(ref i)
var i = 0;
Incr(ref i);
Console.WriteLine(i);
会给我们“1”。怎么可能?
答案 0 :(得分:8)
将i += Incr(ref i)
视为
i = i + Incr(ref i);
换句话说:
i
Incr(ref i)
i
现在Incr(ref i)
将i
设置为1,但返回 0 ...因此总和最终为0 + 0,然后分配给{{1} }。在i
返回且结果被分配回i
之间的时间内,Incr
的值非常暂时 1。
如果你有:
i
然后你最终得到int j = i + Incr(ref i);
。
当 调用j=0, i=1
时,Incr(ref i)
会增加Incr
(因此i
为1),然后忽略返回值。那么i
之后就是1。
在其他新闻中:应该不惜一切代价避免这样的代码。
答案 1 :(得分:0)
您的代码的作用:
db.select('SELECT * FROM users');
变为i += Incr(ref i);
(这就是i = i + Incr(ref i);
所做的事情。)+=
。 i +
为0; 结果A i
Incr(ref i)
为0; i
。 i
仍为0. 结果B i
增加i
。由于i++
已作为i
传递:ref
为1,但i
在评估中没有任何作用,因为i
已经过评估!