Каков порядок выполнения C# в вызове функции с 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# lang spec.
1 ответ
Решение
C# требует, чтобы выражения параметров, передаваемые в методы, оценивались слева направо.
Хотя qwe
заканчивает свою работу до вызова asd
C# захватил ссылку на "старый" A
перед вызовом qwe
в подготовке к вызову. Вот почему первый аргумент первого вызова asd
получает "старый" A
объект, прежде чем он будет заменен новым A
объект внутри qwe
вызов.