Когда ключевое слово 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:
- The instance constructor
- The Invoke method shall be virtual
- The BeginInvoke method, if present, shall be virtual
- 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 могло быть выполнено при вызове этих методов?