Подтвердить что ты не робот

Любая разница заключается в вызове метода (делегирования) и прямого вызова?

Возможно, этот вопрос задан раньше, я сделал googling, но я не получил ответа.

Прототип делегирования

delegate void method1(string str);

Добавление методов обратного вызова

method1 objDel2;           
objDel2 = new method1(TestMethod1);            
objDel2("test");
objDel2.Invoke("Invoke");

В приведенном выше кодировании objDel2("test"); и objDel2.Invoke("Invoke"); выполняют одну и ту же задачу. Хорошая или оба одинаковы.

4b9b3361

Ответ 1

Они на 100% идентичны - это чистый сахар-компилятор (см. ниже). Что касается того, что является предпочтительным: ни/оба.

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);
    }
}

имеет 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 
}

Обратите внимание, что оба делают то же самое (см. два расположения, отмеченные мной как ***HERE***)