Почему типы делегатов являются производными от класса MulticastDelegate, почему они не являются производными от класса Delegate? - PullRequest
4 голосов
/ 29 января 2011

У меня очень простой вопрос относительно типов делегатов.Я сравнил члены классов Delegate и MulticastDelegate в браузере объектов и не смог найти никаких новых дополнительных членов, присутствующих в MulticastDelegate.Я также заметил, что в классе Delegate есть виртуальный метод GetInvocationList.Поэтому я предполагаю, что класс Delegate должен иметь возможность хранить ссылки на несколько методов.Если мое предположение верно, я удивляюсь, почему пользовательские типы делегатов не наследуются напрямую от класса Delegate, а не от класса MulticastDelegate.Не уверен, что мне здесь не хватает.Пожалуйста, помогите мне понять разницу.

1 Ответ

10 голосов
/ 29 января 2011

По сути, разделение Delegate и MulticastDelegate по историческим причинам.Первоначально должны были быть делегаты, которые не могли бы быть объединены , и те, которые могли бы ... но это оказалось не полезным отличием.Очевидно, это было обнаружено только тогда, когда было слишком поздно вырвать MulticastDelegate из каркаса / CLR.

Из CLR через C #, 3-е издание:

Система.Класс MulticastDelegate является производным от System.Delegate, который сам является производным от System.Object.Причина, по которой существует два класса делегатов, является исторической и неудачной;в FCL должен быть только один класс делегатов.К сожалению, вам необходимо знать оба этих класса, потому что, хотя все создаваемые вами типы делегатов имеют MulticastDelegate в качестве базового класса, вы иногда будете манипулировать типами делегатов с помощью методов, определенных классом Delegate, а не классом MulticastDelegate.[...]

...