Компилятор обработки делегата - PullRequest
2 голосов
/ 17 ноября 2009

Если я объявляю делегата

public delegate void firstDelegate(string str);

firstDelegate handler = Strfunc;

handler("Hello World");

  ..
  static void Strfunc(string str)
  {
        Console.WriteLine(str);
  }

компилятор переведет следующую строку

firstDelegate handler=Strfunc;

в

firstDelegate=new firstDelegate(Strfunc);

Ответы [ 2 ]

2 голосов
/ 17 ноября 2009

Это верно. Вот разборка с отражателя:

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 3
    .locals init (
        [0] class ConsoleApplication4.Program/firstDelegate handler)
    L_0000: nop 
    L_0001: ldnull 
    L_0002: ldftn void ConsoleApplication4.Program::Strfunc(string)
    L_0008: newobj instance void ConsoleApplication4.Program/firstDelegate::.ctor(object, native int)
    L_000d: stloc.0 
    L_000e: ldloc.0 
    L_000f: ldstr "Hello World"
    L_0014: callvirt instance void ConsoleApplication4.Program/firstDelegate::Invoke(string)
    L_0019: nop 
    L_001a: ret 
}

, который выглядит так в C #:

private static void Main(string[] args)
{
    firstDelegate handler = new firstDelegate(Program.Strfunc);
    handler("Hello World");
}
1 голос
/ 17 ноября 2009

Пока что могу сказать, ДА.

Это называется «выводом делегата».

Кстати, если вы хотите "добавить" другую функцию к этому делегату, используйте:

обработчик + = AnotherFunctionName;

А вот слова из C # Pros в книге professional-C # -2008, глава 7:

Чтобы меньше печатать, в любом месте, где необходим экземпляр делегата, вы можете просто передать имя адрес. Это известно термином «вывод делегата». Эта функция C # работает до тех пор, пока компилятор может разрешить экземпляр делегата для определенного типа. Код, созданный компилятором C #, такой же. Компилятор обнаруживает, что тип делегата требуется, поэтому он создает экземпляр этого типа делегата и передает адрес метода конструктору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...