Сгенерированный компилятором запечатанный класс для ключевого слова делегата содержит виртуальные методы

Когда ключевое слово delegateиспользуется в C #, компилятор C #автоматически генерирует класс, производный от класса System.MulticastDelegate.

Этот сгенерированный компилятором класс также содержит 3 метода :Invoke, BeginInvoke and EndInvoke..

Все эти три метода помечены public virtual extern, но, что интересно, сам класс помечен sealed.

Виртуальные методы, определенные в закрытом классе, не только кажутся контр-интуитивными, но и фактически незаконны в C #.

Итак, мой вопрос: есть ли для этого конкретная причина или это просто одна из тех безобидных вещей, которые делаются с учетом некоторого гипотетического будущего улучшения?

Редактировать 1:

Может ли причина заключаться в том, чтобы принудительно использовать код операции IL «callVirt» вместо «вызова», чтобы объект делегата всегда проверялся на нуль CLR перед попыткой выполнить любой из трех методов? Хотя я не понимаю, почему delegateдолжен быть особым случаем в этом отношении.

Кроме того, принудительное использованиеcallvirt(не влияет на производительность. хотя она может быть ничтожной)

Редактировать 2:

Добавлен тег CIL, так как оказалось, что способ определения делегатов C #фактически предусмотрен стандартом CIL. В стандарте указано, что (следующее не является полным текстом)

Delegates shall have a base type of System.Delegate. Delegates shall be declared sealed, and the only members a delegate shall have are either the first two or all four methods as specified here. These methods shall be declared runtime and managed. They shall not have a body, since that body shall be created automatically by the VES. Other methods available on delegates are inherited from the class System.Delegate in the Base Class Library. The delegate methods are:

  1. The instance constructor
  2. The Invoke method shall be virtual
  3. The BeginInvoke method, if present, shall be virtual
  4. The EndInvoke method shall be virtual

Так что это определенно не побочный эффект процесса компиляции и не похоже на другие интересные результаты компилятора.

Если стандарт что-то подчеркивает, это должно быть по какой-то веской причине и обоснованию.

Итак, теперь возникает вопрос, почему стандарт CIL для делегатов делает упор на запечатанных и виртуальных одновременно?

Подвох здесь?:

They shall not have a body, since that body shall be created automatically by the VES.

Помечены ли они как виртуальные, чтобы сгенерированное тело VES/CLR могло быть выполнено при вызове этих методов?

18
задан Amit Mittal 11 July 2012 в 10:02
поделиться