Эта формулировка кажется немного запутанной, но может быть проиллюстрирована примером. Предположим, что кто-то проектировал кнопочный элемент управления, который хотел бы предоставить уведомление, когда он был нажат. Обычная практика заключалась бы в том, чтобы кнопка поддерживала список делегатов для вызова. Если класс хотел бы, чтобы кнопка вызывала один из своих методов по самому экземпляру, он может легко построить делегат, который будет вызывать этот метод в этом экземпляре. Обратите внимание, что использование делегата для этой цели означает, что необходимо создать объект кучи для делегата в дополнение к экземпляру, метод которого должен вызвать делегат.
Альтернативным подходом было бы определить интерфейс INotifyOfButtonClick
, с использованием метода NotifyOfButtonClick()
, и иметь контроль кнопки, чтобы сохранить список INotifyButtonClick
. Когда кнопка нажата, она будет вызывать NotifyOfButtonClick()
для каждого экземпляра. Если в форме только одна кнопка, которая использует этот интерфейс, или если все такие кнопки используют один и тот же метод, форма может сама реализовать INotifyOfButtonClick()
и добавить себя к списку подписки на кнопки (ов), вместо того, чтобы создавать отдельный делегат для вызова его метода. В сценариях, где этот подход работает, он может быть более эффективным, чем использование делегатов. Если в форме будут две кнопки, которые используют один и тот же интерфейс, но, однако, захотят вызывать разные методы, все усложняется. В этом случае было бы необходимо, чтобы форма создала новый объект, целью которого было реализовать INotifyOfButtonClick()
, вызвав некоторый метод в форме, к которой он содержит ссылку. Использование таких объектов-оберток, вероятно, даст производительность, сопоставимую с делегатами, но без участия некоторых делегатов, получающих компилятор.
Кстати, если Microsoft может добавить к каждому делегату вложенный интерфейс IInvoke
(таким образом, что, например, Action<int>
будет определять интерфейс Action<int>.IInvoke
), а затем, если методы, которые приняли Action<int>
были переписаны, чтобы принять Action<int>.IInvoke
, тогда объекты, только один метод которые собирались вызывать такие делегаты, могли просто перейти к таким методам. Такая особенность может повысить эффективность закрытия.
Вы можете рассматривать делегаты как интерфейсы с одним методом. – Steven
Я оставил отзыв в статье MSDN, что формулировка может быть более четкой. –