В чем преимущества делегатов в C#.NET?
Пожалуйста, скажите мне ответ на мой вопрос.
kanmaniponniah
спасибо.Это использовать полный для меня
спасибо.Это использовать полный для меня
Пара ссылок, которые помогут вам начать понимать преимущества -
Делегаты и их роль в событиях в C# .NET[^]
Понимание делегатов в C#[^]
Хорошие связи Абхинав....
Спасибо, Правин.
Хорошо, мой 5-й, но смотрите мой ответ: объяснение более по существу.
--СА
Увидел его и уже проголосовал за него. :)
Большое спасибо.
Забавно: все больше людей заявляли, что голосовали, но на самом деле голосовал только один.
(конечно, это не проблема, такое случается постоянно).
--СА
Странный. Я действительно пропустил голосование за тебя. Теперь исправлено.
Спасибо, что обратили на это внимание.
Спасибо. Ничего странного: кто-то еще забыл; как я уже сказал, это не проблема.
--СА
Хорошие связи.
Спасибо, Абхинав.
Хорошо, мои 5, но смотрите мой ответ: короткое объяснение, более к делу.
--СА
Спасибо Сакрюкову
Делегаты обеспечивают дополнительный уровень абстракции, потому что вы можете абстрагировать какое-то действие, выраженное в коде, и передать его в качестве параметра в какой-то другой метод, как и любой другой параметр.
Это называется "первоклассный гражданин".
Виртуальные методы ООП и поздняя привязка делают что-то подобное (и this
это также параметр метода, скрытый на), но делегированный не имеет никаких ограничений: экземпляры делегата могут принимать любой метод в своем списке вызовов; если метод имеет соответствующую сигнатуру, он может быть виртуальным или нет, статическим или экземплярным методом, того же класса или любого другого (что является основным отличием делегата от виртуального метода).
Чтобы показать основную цель концепции первоклассного гражданина, представьте себе, что у вас есть сложный алгоритм обхода данных. Вы хотите выбрать только часть подмножества элементов данных по некоторому предикату и выполнить некоторое действие над каждым из них. Алгоритм обхода должен быть универсальным, не зависящим ни от действия, ни от предиката. Вот как:
void TraverseData( MyDataContainer data, Func<DataElement> predicate, Action<DataElement> dataProcessor) { //... DateElement element = //... if (predicate(element)) dataProcessor(element); //... } //TraverseData
Хороший ответ SA! 5+
Только одно Не называйте это так "профиль в списке вызовов" В нашей терминологии для этого есть слово, и это слово "подпись".
Манфред, большое спасибо за помощь!
Я изменил: "метод с соответствующей подписью". Гораздо лучше, правда?
--СА
Я все еще думаю, что "в списке призывов" излишне. Сигнатура метода - это как порядок, так и тип параметров, поэтому, на мой взгляд, достаточно "любого метода с соответствующей сигнатурой". :)
Это не та структура, которую я имею в виду (английский язык не терпит столь длинных конструкций, так что это моя вина злоупотреблять ею в данном случае); не "сопоставление в списке вызовов", а "принятие методов сопоставления"; я исправлю, спасибо.
--СА
Хорошо, я думаю, что теперь понял, что вы имели в виду под списком вызовов. Моя вина! Я не думал о возможности назначения более одного обработчика (с соответствующей сигнатурой). Всегда есть чему поучиться ( или запомнить, как в моем случае): -).
Нет, Нет, спасибо за ваши заметки, потому что оригинальный текст (конечно, очень быстро набранный) содержал двусмысленность из-за допущенных мной структурных злоупотреблений.
Любой экземпляр делегата (любой, я имею в виду его) содержит список вызовов, каждый "+=" добавляет еще один элемент, каждый "=" очищает их все, устанавливает только один-не все это знают, это больше известно о событиях).
Мое " нет "не относится к" всегда есть чему поучиться", есть, действительно, много.
--СА
Ладно, значит, я тебя правильно понял!
:-)
Пожалуйста, ознакомьтесь с моей новой статьей на эту тему (ссылка в моем обновленном ответе),
--СА