2010-10-05 2 views
2

Когда я смотрел на Action делегатов рефлектора, я увидел, что это имеет конструктор, какГде определены конструкторы делегатов и функции-члены?

public Action(object @object, IntPtr method); 

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

ответ

4

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

Раздел 8.9.3 из ECMA-335 переговоры раздела I по этому поводу:

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

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

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

(VES является Virtual Execution System;. СЬК является реализация Microsoft, на VES)

+0

Джон Скит на помощь! Спасибо человеку за эту ценную информацию. –