Ahora que C# admite parámetros con nombre, estaba verificando si se implementó de la misma manera que lo hizo VB, y encontré que hay una pequeña diferencia. Tomemos, por ejemplo, una función de biblioteca de esta manera:¿Diferencias entre cómo C# y VB manejan parámetros con nombre?
public static void Foo(string a, string b)
{
Console.WriteLine(string.Format("a: {0}, b: {1}", a, b));
}
En C#, si se llama así:
Foo(a: "a", b: "b");
El compilador produce las siguientes instrucciones 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
Que se traduce en el siguiente código C#:
string CS$0$0000 = "a";
string CS$0$0001 = "b";
Test.Foo(CS$0$0000, CS$0$0001);
En VB, si se llama así:
Foo(a:="a", b:="b")
El compilador produce las siguientes instrucciones 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 traduce en el siguiente código VB:
Foo("a", "b");
La forma en que lo hace VB requiere muchas menos llamadas de instrucciones, entonces ¿hay alguna ventaja en la forma en que C# lo implementa? Si no usa los parámetros nombrados, C# produce lo mismo que VB.
EDITAR: Ahora que hemos determinado que las instrucciones adicionales desaparecen en modo de lanzamiento, ¿hay una razón particular para que puedan estar presentes en el modo de depuración? VB actúa igual en ambos modos, y C# no inserta las instrucciones adicionales cuando se llama al método normalmente sin parámetros nombrados (incluso cuando se usan parámetros opcionales).
Cambiar el orden de los parámetros, Foo (b: = "b", a: = "a") para ver la diferencia (sugerencia: orden de efectos secundarios) – adrianm
¿Cuál es el código VB equivalente? –
@adrianm una idea interesante, pero acabo de probarlo (por curiosidad) y eso genera la misma IL como 'Foo (a:" a ", b:" b ");' –