Почему типы делегатов являются производными от класса 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. [...]

Другие вопросы по тегам