使用 ref 的函数调用中的 C# 执行顺序是什么?
What is C# order of execution in function call with ref?
所以我刚刚在我们的代码中发现了这个错误:
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# 语言规范中找不到有关执行顺序的具体信息。
C# 要求传递给方法的参数表达式从左到右求值。
即使 qwe
在调用 asd
之前完成其工作,C# 已捕获对 "old" A
before[=23] 的引用=] 调用 qwe
为调用做准备。这就是为什么 asd
的第一个调用的第一个参数在被 qwe
中的新 A
对象替换之前获得 "old" A
对象的原因打电话。
所以我刚刚在我们的代码中发现了这个错误:
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# 语言规范中找不到有关执行顺序的具体信息。
C# 要求传递给方法的参数表达式从左到右求值。
即使 qwe
在调用 asd
之前完成其工作,C# 已捕获对 "old" A
before[=23] 的引用=] 调用 qwe
为调用做准备。这就是为什么 asd
的第一个调用的第一个参数在被 qwe
中的新 A
对象替换之前获得 "old" A
对象的原因打电话。