SRINIVASA RAO T Ответов: 3

В чем преимущества делегатов в C#.NET?


Пожалуйста, скажите мне ответ на мой вопрос.

kanmaniponniah

спасибо.Это использовать полный для меня

3 Ответов

Рейтинг:
23

Abhinav S

Пара ссылок, которые помогут вам начать понимать преимущества -
Делегаты и их роль в событиях в C# .NET[^]
Понимание делегатов в C#[^]


Pravin Patil, Mumbai

Хорошие связи Абхинав....

Abhinav S

Спасибо, Правин.

Sergey Alexandrovich Kryukov

Хорошо, мой 5-й, но смотрите мой ответ: объяснение более по существу.
--СА

Abhinav S

Увидел его и уже проголосовал за него. :)

Sergey Alexandrovich Kryukov

Большое спасибо.

Забавно: все больше людей заявляли, что голосовали, но на самом деле голосовал только один.
(конечно, это не проблема, такое случается постоянно).
--СА

Abhinav S

Странный. Я действительно пропустил голосование за тебя. Теперь исправлено.
Спасибо, что обратили на это внимание.

Sergey Alexandrovich Kryukov

Спасибо. Ничего странного: кто-то еще забыл; как я уже сказал, это не проблема.
--СА

Рейтинг:
18

Abhinav S

Хорошие связи.

[no name]

Спасибо, Абхинав.

Sergey Alexandrovich Kryukov

Хорошо, мои 5, но смотрите мой ответ: короткое объяснение, более к делу.
--СА

[no name]

Спасибо Сакрюкову

Рейтинг:
12

Sergey Alexandrovich Kryukov

Делегаты обеспечивают дополнительный уровень абстракции, потому что вы можете абстрагировать какое-то действие, выраженное в коде, и передать его в качестве параметра в какой-то другой метод, как и любой другой параметр.
Это называется "первоклассный гражданин".

Виртуальные методы ООП и поздняя привязка делают что-то подобное (и this это также параметр метода, скрытый на), но делегированный не имеет никаких ограничений: экземпляры делегата могут принимать любой метод в своем списке вызовов; если метод имеет соответствующую сигнатуру, он может быть виртуальным или нет, статическим или экземплярным методом, того же класса или любого другого (что является основным отличием делегата от виртуального метода).

Чтобы показать основную цель концепции первоклассного гражданина, представьте себе, что у вас есть сложный алгоритм обхода данных. Вы хотите выбрать только часть подмножества элементов данных по некоторому предикату и выполнить некоторое действие над каждым из них. Алгоритм обхода должен быть универсальным, не зависящим ни от действия, ни от предиката. Вот как:

void TraverseData(
         MyDataContainer data,
         Func<DataElement> predicate,
         Action<DataElement> dataProcessor) {
    //...
    DateElement element = //...
    if (predicate(element))
        dataProcessor(element);
    //...
} //TraverseData


[Правка-фиксированная ссылка]
См. также мой другой ответ: В чем заключается дополнительное преимущество делегирования[^]

[РЕДАКТИРОВАТЬ]
Дополнительные сведения об использовании делегатов см. В моей новой статье на эту тему:
Диспетчер Динамических Методов[^]

—СА


Manfred Rudolf Bihy

Хороший ответ SA! 5+

Только одно Не называйте это так "профиль в списке вызовов" В нашей терминологии для этого есть слово, и это слово "подпись".

Sergey Alexandrovich Kryukov

Манфред, большое спасибо за помощь!
Я изменил: "метод с соответствующей подписью". Гораздо лучше, правда?
--СА

Manfred Rudolf Bihy

Я все еще думаю, что "в списке призывов" излишне. Сигнатура метода - это как порядок, так и тип параметров, поэтому, на мой взгляд, достаточно "любого метода с соответствующей сигнатурой". :)

Sergey Alexandrovich Kryukov

Это не та структура, которую я имею в виду (английский язык не терпит столь длинных конструкций, так что это моя вина злоупотреблять ею в данном случае); не "сопоставление в списке вызовов", а "принятие методов сопоставления"; я исправлю, спасибо.
--СА

Manfred Rudolf Bihy

Хорошо, я думаю, что теперь понял, что вы имели в виду под списком вызовов. Моя вина! Я не думал о возможности назначения более одного обработчика (с соответствующей сигнатурой). Всегда есть чему поучиться ( или запомнить, как в моем случае): -).

Sergey Alexandrovich Kryukov

Нет, Нет, спасибо за ваши заметки, потому что оригинальный текст (конечно, очень быстро набранный) содержал двусмысленность из-за допущенных мной структурных злоупотреблений.
Любой экземпляр делегата (любой, я имею в виду его) содержит список вызовов, каждый "+=" добавляет еще один элемент, каждый "=" очищает их все, устанавливает только один-не все это знают, это больше известно о событиях).
Мое " нет "не относится к" всегда есть чему поучиться", есть, действительно, много.
--СА

Manfred Rudolf Bihy

Ладно, значит, я тебя правильно понял!

Sergey Alexandrovich Kryukov

:-)

Sergey Alexandrovich Kryukov

Пожалуйста, ознакомьтесь с моей новой статьей на эту тему (ссылка в моем обновленном ответе),
--СА