Теперь, когда C # поддерживает именованные параметры, я проверял, реализован ли он так же, как VB, и обнаружил, что есть небольшая разница. Возьмем для примера библиотечную функцию, подобную этой:
public static void Foo(string a, string b)
{
Console.WriteLine(string.Format("a: {0}, b: {1}", a, b));
}
<ч />
В C #, если вы называете это так:
Foo(a: "a", b: "b");
Компилятор выдает следующие инструкции IL:
.locals init (
[0] string CS$0$0000,
[1] string CS$0$0001)
L_0000: nop
L_0001: ldstr "a"
L_0006: stloc.0
L_0007: ldstr "b"
L_000c: stloc.1
L_000d: ldloc.0
L_000e: ldloc.1
L_000f: call void [TestLibrary]TestLibrary.Test::Foo(string, string)
L_0014: nop
L_0015: ret
Что означает следующий код C #:
string CS$0$0000 = "a";
string CS$0$0001 = "b";
Test.Foo(CS$0$0000, CS$0$0001);
<ч />
В VB, если вы называете это так:
Foo(a:="a", b:="b")
Компилятор выдает следующие инструкции IL:
L_0000: nop
L_0001: ldstr "a"
L_0006: ldstr "b"
L_000b: call void [TestLibrary]TestLibrary.Test::Foo(string, string)
L_0010: nop
L_0011: nop
L_0012: ret
Что означает следующий код VB:
Foo("a", "b");
<ч />
То, как VB делает это, требует гораздо меньше вызовов инструкций, так есть ли какое-то преимущество в том, как C # реализует это? Если вы не используете именованные параметры, C # выдает то же самое, что и VB.
<ч />
EDIT : Теперь, когда мы определили, что дополнительные инструкции исчезают в режиме выпуска, есть ли какая-то особая причина их присутствия в режиме отладки? VB действует одинаково в обоих режимах, и C # не вставляет дополнительные инструкции при обычном вызове метода без именованных параметров (в том числе при использовании необязательных параметров).