Порядок оценки названных параметров
Возможный дубликат:
Параметры оцениваются по порядку при передаче в метод?
Скажи у меня
void foo (int x, int y)
и позвоните по:
foo(y: genNum(), x: genNum())
Гарантирует ли C# порядок вычисления x и y в этом случае?
3 ответа
Согласно спецификации, аргументы всегда оцениваются слева направо. К сожалению, в некоторых угловых случаях в C# 4.0 есть несколько ошибок. См. Статью Эрика Липперта в разделе "Оцениваются ли параметры по порядку при передаче в метод?" Больше подробностей.
Кроме того, это, вероятно, плохая практика. Если вы хотите гарантировать порядок оценки аргументов, сначала запишите результат в локальную переменную, а затем передайте результаты в метод потребления, например:
int capturedY = genNum(); //It is important that Y is generated before X!
int capturedX = genNum();
foo(capturedX, capturedY);
Я не могу придумать вескую причину, чтобы так не поступать.
Это не ответ, просто чтобы показать побочный эффект.
public void Test()
{
foo(y: genNum(), x: genNum());
}
int X=0;
int genNum()
{
return ++X;
}
void foo(int x, int y)
{
Console.WriteLine(x);
Console.WriteLine(y);
}
ВЫХОД:
2
1
Согласно глубине C# - необязательные параметры и именованные аргументы:
... Второй из этих вызовов меняет порядок аргументов, но результат остается тем же, потому что аргументы сопоставляются с параметрами по имени, а не по положению.
В вашем случае сначала будет выполнен y
и после x
, как это появляется первым (слева) в объявлении функции.
Тот факт, что он действительно заканчивается как второй параметр, является деталью реализации компилятора C#, который реализует именованные параметры.