c# - tipo - ¿Hay alguna diferencia hay un método de invocación(delegado) y una llamada directa?
metodos en c# (1)
Esta pregunta ya tiene una respuesta aquí:
- Diferencia entre delegado. Invocar y delegar () 3 respuestas
Puede ser esta pregunta formulada anteriormente, hice google pero no obtuve respuesta.
Prototipo del delegado
delegate void method1(string str);
Adición de métodos de devolución de llamada
method1 objDel2;
objDel2 = new method1(TestMethod1);
objDel2("test");
objDel2.Invoke("Invoke");
En la codificación anterior objDel2("test");
y objDel2.Invoke("Invoke");
están haciendo la misma tarea. Que uno es bueno o ambos son iguales.
Son 100% idénticos, esto es azúcar de compilación pura (ver más abajo). En cuanto a lo que se prefiere: ninguno / ambos.
static class Program {
static void Main()
{
method1 objDel2;
objDel2 = new method1(TestMethod1);
objDel2("test");
objDel2.Invoke("Invoke");
}
delegate void method1(string val);
static void TestMethod1(string val) {
System.Console.WriteLine(val);
}
}
tiene la IL
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] class Program/method1 ''method'')
L_0000: ldnull
L_0001: ldftn void Program::TestMethod1(string)
L_0007: newobj instance void Program/method1::.ctor(object, native int)
L_000c: stloc.0
L_000d: ldloc.0
L_000e: ldstr "test"
L_0013: callvirt instance void Program/method1::Invoke(string) ***HERE***
L_0018: ldloc.0
L_0019: ldstr "Invoke"
L_001e: callvirt instance void Program/method1::Invoke(string) ***HERE***
L_0023: ret
}
Tenga en cuenta que ambos hacen lo mismo (vea las dos ubicaciones marcadas por mí como ***HERE***
)