usos tipo suscribirse puede metodos invocar hilos evento ejemplos delegate delegados delegado caracteristicas c#

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í:

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*** )