什么是使用ref的函数调用中的C#执行顺序?

时间:2017-01-10 12:53:51

标签: c# operator-precedence

所以我刚刚在代码中发现了这个错误:

class A
{
    public int a;
}
var x = new A();
x.a = 1;
A qwe(ref A t) {
    t = new A();
    t.a = 2;
    return t;
}
void asd(A m, A n) {
    Console.WriteLine(m.a);
    Console.WriteLine(n.a);
}

asd(x, qwe(ref x));
asd(x, qwe(ref x));

是否在函数调用中指定了关于参数顺序的执行顺序?

这里写的是:

1
2
2
2

这意味着在调用第二个参数的函数之前保存第一个参数的引用。

这是定义的行为吗?我无法在C#lang规范中找到有关执行顺序的具体信息。

1 个答案:

答案 0 :(得分:8)

C#要求传递给方法的参数表达式从左到右进行计算。

即使qwe在调用asd之前完成了工作,C#也会在调用{{1}之前捕获对“旧”A 的引用准备电话。这就是qwe第一次调用的第一个参数在被asd调用中的新A对象替换之前获取“旧”A对象的原因。