返回参考值时的不明确行为

Ant*_*n23 1 c#

我有一段代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Console.WriteLine(i)会给我们"0".但是在没有"+ ="的情况下调用Incr(ref i)

var i = 0;
Incr(ref i);
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

会给我们"1".这怎么可能?

Jon*_*eet 8

想想i += Incr(ref i)作为

i = i + Incr(ref i);
Run Code Online (Sandbox Code Playgroud)

换一种说法:

  • 评估 i
  • 呼叫 Incr(ref i)
  • 将两个操作数一起添加
  • 分配给 i

现在Incr(ref i)设置i为1,但返回 0 ...所以总和最终为0 + 0,然后分配给i.的值i非常暂时 1,在之间的时间Incr返回并且结果被分配回i.

如果你有:

int j = i + Incr(ref i);
Run Code Online (Sandbox Code Playgroud)

然后你最终会j=0, i=1.

当你只是调用Incr(ref i)然后Incr增加i(所以i是1)然后忽略返回值...所以i之后是1.

在其他新闻中:应该不惜一切代价避免这样的代码.