Когда ключевое слово delegate
используется в С#, компилятор С# автоматически генерирует класс, полученный из класса System.MulticastDelegate
.
Этот сгенерированный компилятором класс содержит также 3 метода: Invoke, BeginInvoke and EndInvoke
.
Все эти три метода отмечены public virtual extern
но интересно, что сам класс отмечен sealed
.
Виртуальные методы, определенные в закрытом классе, не только воспринимаются как интуитивно понятные, но и фактически являются незаконными в С#.
Поэтому мой вопрос заключается в том, есть ли конкретная причина для этого или это только одна из тех безвредных вещей, сделанных с учетом некоторого гипотетического будущего улучшения?
Изменить 1:
Может ли причина принудительно использовать код операции "callVirt" IL в отличие от "вызова", чтобы объект-делегат всегда проверялся значением null в среде CLR, прежде чем пытаться выполнить любой из трех методов? Хотя я не понимаю, почему delegate
должен быть особым делом в этом отношении.
Кроме того, это не удар производительности, чтобы заставить использовать callvirt
(хотя это может быть незначительное)
Изменить 2:
Добавлен тег CIL, так как выясняется, что способ определения делегатов С# на самом деле определяется стандартом CIL. Стандарт утверждает, что (следующий не полный текст)
Делегаты должны иметь базовый тип System.Delegate. Делегаты должны быть запечатаны, и единственными членами, которых имеет делегат, являются либо первые два, либо все четыре метода, как указано здесь. Эти методы должны быть объявлены временем выполнения и управляемыми. У них не должно быть тела, так как этот орган должен автоматически создаваться VES. Другие методы, доступные для делегатов, наследуются от класса System.Delegate в библиотеке базового класса. Методы делегата:
- Конструктор экземпляра
- Метод Invoke должен быть виртуальным
- Метод BeginInvoke, если он есть, должен быть виртуальным
- Метод EndInvoke должен быть виртуальным
Таким образом, это определенно не является побочным эффектом процесса компиляции или аналогичен другим интересным выходам компилятора.
Если стандарт подчеркивает что-то, это должно быть по какой-то веской причине и обоснованию.
Итак, теперь вопрос заключается в том, почему стандарт CIL для делегатов подчеркивает одновременно герметичность и виртуальность?
Есть ли уловка здесь?:
У них не должно быть тела, так как этот орган должен автоматически создаваться VES.
Являются ли они помечены как виртуальные, так что тело, созданное VES/CLR, может быть выполнено при вызове этих методов?