Где определяются конструкторы делегатов и функции-члены? - PullRequest
2 голосов
/ 05 октября 2010

Когда я смотрел на делегатов Action в Reflector, я увидел, что у него есть конструктор, такой как

public Action(object @object, IntPtr method);

Но я не смог найти тела для того же самого, наряду с другими функциями-членами, такими как Invoke, BeginInvoke и т. Д. Я могу видеть только определения для него.Где эти функции определены?Они определены вне .net BCL?

1 Ответ

4 голосов
/ 05 октября 2010

Делегаты обрабатываются специально CLR, в основном.Компилятор предоставляет подписи, но CLR знает, что с ними делать.

Раздел 8.9.3 раздела ECMA-335 Я говорю об этом:

Делегаты являются объектно-ориентированным эквивалентом указателей на функции.В отличие от указателей на функции, делегаты являются объектно-ориентированными, безопасными по типу и безопасными.Делегаты создаются путем определения класса, производного от базового типа System.Delegate (см. Раздел IV).Каждый тип делегата должен предоставлять метод с именем Invoke с соответствующими параметрами, и каждый экземпляр делегата перенаправляет вызовы его метода Invoke одному или нескольким совместимым статическим или методам экземпляра для конкретных объектов.Объекты и методы, которым он делегирует, выбираются при создании экземпляра делегата.

Помимо конструктора экземпляра и метода Invoke, делегаты могут дополнительно иметь два дополнительных метода: BeginInvoke и EndInvoke.Они используются для асинхронных вызовов.

Хотя делегаты, по большей части, являются просто еще одним видом пользовательского класса, они жестко контролируются.Реализации методов предоставляются VES, а не кодом пользователя.Единственными дополнительными членами, которые могут быть определены в типах делегатов, являются статические или методы экземпляров.

(VES - это система виртуального выполнения; CLR - это реализация VES от Microsoft.)

...