Несколько дней назад я спросил почему делегаты являются ссылочными типами, на основе моего ошибочного представления о том, что все, что вам нужно для делегата, - это две ссылки: одна для объекта, и один к функции. Что я полностью забыл (не потому, что я не знал, просто потому, что я забыл), так это то, что в .NET делегаты, по крайней мере, частично созданы для поддержки событий как встроенной реализации "Шаблон наблюдателя" , что означает, что каждый делегат поддерживает несколько подписчиков посредством списка вызовов.
Это заставило меня задуматься, делегаты действительно играют две разные роли в мире .NET. Один из них относится к указателю смиренной функции, например:
Action<string> writeLine = Console.WriteLine;
Другой - наблюдаемый:
textBox.TextChanged += HandleTextChanged;
Существование списка вызовов, по-видимому, исключительно для второй роли, так как в примерах, как простой пример writeLine
выше, вы вообще даже не думаете о подписчиках.
Так что, действительно, мне кажется, что могут быть два разных "вида" делегатов: тип "указатель функции" и "наблюдаемый" вид. Первый, как мне кажется, может быть типом значения.
Теперь я не утверждаю, что это должно быть так, если это возможно. Я уверен, что было бы много недостатков для проведения этого различия между делегатами регулярных и многоадресных рассылок, такими как вероятная высокая частота бокса, если делегаты были типами значений, возможная необходимость ввести новое ключевое слово (multicast
?), неизбежная неразбериха разработчиков и т.д. То, что мне действительно интересно знать, просто, если бы с точки зрения CLR было возможно иметь тип значения, который мог бы действовать как указатель функции.
Я предполагаю, что другой способ спросить это: System.Delegate
, с его списком вызовов и всеми, в основном базовым CLR-типом; или это оболочка вокруг более простого типа "функции ссылки", который просто не отображается на каких-либо языках CLR?
Я извиняюсь за все неофициальные термины, которые я использовал, которые, возможно, путали некоторых из более образованных разработчиков.