Порядок оценки названных параметров

Возможный дубликат:
Параметры оцениваются по порядку при передаче в метод?

Скажи у меня

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#, который реализует именованные параметры.

Другие вопросы по тегам