2013-09-06 3 views
2

Добрый день всем,Вызов/Создание делегата

есть 2 пути я заметил, что я могу ссылаться/создать делегат либо

MrDel MyDelegate = new MrDel(Mathmetics.Method);

или

MrDel MyDelegate = Mathmetics.Method;

So мой вопрос - в чем разница между этими двумя способами? Почему мне нужно использовать первый, если второй гораздо короче, и они, похоже, делают то же самое? Просматривая некоторые из уроков, я вижу ppl либо с использованием первого или второго способа, но они не очень объясняют ПОЧЕМУ. Не могли бы вы помочь мне дать понять или указать, где я могу это прочитать, спасибо.

ПОЛНЫЙ КОД:

class Program 
{ 
    public delegate void MrDel(int arg, ThingsToDo e); 

    static void Main(string[] args) 
    { 
     MrDel MyDelegate = new MrDel(Mathmetics.Method); 
     //MrDel MyDelegate = Mathmetics.Method; 


     Method(MyDelegate); 

     Console.Read(); 
    } 

ответ

3

Они же - второй Syntactic Sugar для первой. Чтобы подтвердить, я посмотрел на ИЛ, сгенерированный для обоих, и они идентичны:

IL_0001: ldarg.0  
IL_0002: ldftn  UserQuery.Method 
IL_0008: newobj  UserQuery+MrDel..ctor 
IL_000D: stloc.0  // MyDelegate 

Method: 
IL_0000: nop   
IL_0001: ret   

MrDel.Invoke: 

MrDel.BeginInvoke: 

MrDel.EndInvoke: 

MrDel..ctor: 
+1

спасибо! И это хорошо, что вы указали на IL - должно было использовать его, чтобы смотреть под капот на первом месте! : D –

1

Они одинаковы. Синтаксис был создан, чтобы избежать того, чтобы написать это:

button1.Click -= new EventHandler(button1_Click); 

Что сильно терзает новые C# программистов. Как в: «Что мне нужно создать новый делегировать объект до удалить it ???». Да, да.

Никто не жалуется:

button1.Click -= button1_Click; 
+0

спасибо! хорошо добавить к вышеуказанному :) –

Смежные вопросы