Почему типы делегатов являются производными от класса MulticastDelegate, почему они не являются производными от класса Delegate?
У меня есть очень простой вопрос относительно типов делегатов. Я сравнил членов классов Delegate и MulticastDelegate в браузере объектов и не смог найти никаких новых дополнительных членов, присутствующих в MulticastDelegate. Я также заметил, что класс Delegate имеет виртуальный метод GetInvocationList. Поэтому я предполагаю, что класс Delegate должен иметь возможность хранить ссылки на несколько методов. Если мое предположение верно, я удивляюсь, почему пользовательские типы делегатов не наследуются напрямую от класса Delegate, а не от класса MulticastDelegate. Не уверен, что мне здесь не хватает. Пожалуйста, помогите мне понять разницу.
1 ответ
В основном раскол Delegate
а также MulticastDelegate
по историческим причинам. Первоначально собирались быть делегаты, которых нельзя объединять, и те, которые могли бы... но это оказалось не полезным отличием. Видимо, это было обнаружено только тогда, когда было слишком поздно, чтобы разорвать MulticastDelegate
вне рамок / клр.
Из CLR через C#, 3-е издание:
Класс System.MulticastDelegate является производным от System.Delegate, который сам является производным от System.Object. Причина, по которой есть два класса делегатов, является исторической и неудачной; в FCL должен быть только один класс делегатов. К сожалению, вам необходимо знать оба этих класса, потому что, хотя все создаваемые вами типы делегатов имеют MulticastDelegate в качестве базового класса, вы иногда будете манипулировать типами делегатов с помощью методов, определенных классом Delegate, а не классом MulticastDelegate. [...]