Diferenças entre como C # e VB tratam parâmetros nomeados?

Agora que o C # suporta parâmetros nomeados, eu estava verificando se foi implementado da mesma maneira que o VB o fez e descobri que há uma pequena diferença. Tomemos, por exemplo, uma função de biblioteca como esta:

public static void Foo(string a, string b)
{
    Console.WriteLine(string.Format("a: {0}, b: {1}", a, b));
}

Em C #, se você chamar assim:

Foo(a: "a", b: "b");

O compilador produz as seguintes instruções de IL:

.locals init (
    [0] string CSAgora que o C # suporta parâmetros nomeados, eu estava verificando se foi implementado da mesma maneira que o VB o fez e descobri que há uma pequena diferença. Tomemos, por exemplo, uma função de biblioteca como esta:0000,
    [1] string CSAgora que o C # suporta parâmetros nomeados, eu estava verificando se foi implementado da mesma maneira que o VB o fez e descobri que há uma pequena diferença. Tomemos, por exemplo, uma função de biblioteca como esta: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 

Que se traduz no seguinte código C #:

string CSAgora que o C # suporta parâmetros nomeados, eu estava verificando se foi implementado da mesma maneira que o VB o fez e descobri que há uma pequena diferença. Tomemos, por exemplo, uma função de biblioteca como esta:0000 = "a";
string CSAgora que o C # suporta parâmetros nomeados, eu estava verificando se foi implementado da mesma maneira que o VB o fez e descobri que há uma pequena diferença. Tomemos, por exemplo, uma função de biblioteca como esta:0001 = "b";
Test.Foo(CSAgora que o C # suporta parâmetros nomeados, eu estava verificando se foi implementado da mesma maneira que o VB o fez e descobri que há uma pequena diferença. Tomemos, por exemplo, uma função de biblioteca como esta:0000, CSAgora que o C # suporta parâmetros nomeados, eu estava verificando se foi implementado da mesma maneira que o VB o fez e descobri que há uma pequena diferença. Tomemos, por exemplo, uma função de biblioteca como esta:0001);

No VB, se você chamar assim:

Foo(a:="a", b:="b")

O compilador produz as seguintes instruções de 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 

Que se traduz no seguinte código VB:

Foo("a", "b");

A maneira como o VB exige muito menos chamadas de instrução, então há alguma vantagem na maneira como o C # a implementa? Se você não usar os parâmetros nomeados, o C # produzirá o mesmo que o VB.

EDITAR: Agora que determinamos que as instruções extras desaparecem no modo de lançamento, existe uma razão específica para elas estarem presentes no modo de depuração? O VB age da mesma maneira nos dois modos, e o C # não insere as instruções extras ao chamar o método normalmente sem parâmetros nomeados (inclusive quando você usa parâmetros opcionais).

questionAnswers(2)

yourAnswerToTheQuestion