Где я могу использовать делегатов?

Каковы места реального мира, которые требуют делегатов? Мне любопытно, какие ситуации или шаблоны присутствуют, когда этот метод является лучшим решением. Не требуется код.

Ответ 1

Делегат - это именованный тип, который определяет конкретный вид метода. Так же, как определение класса определяет все члены для данного типа объекта, который он определяет, делегат излагает сигнатуру метода для определенного метода, который он определяет.

На основе этого оператора делегат является указателем на функцию и определяет, как выглядит эта функция.

Отличным примером для реального мира делегата является Predicate. В примере из ссылки вы заметите, что Array.Find берет массив для поиска, а затем предикат для обработки критериев того, что найти, В этом случае он передает метод ProductGT10, который соответствует сигнатуре Predicate.

Ответ 2

Как указано в "Изучение С# 3.0: Изучите основы С# 3.0"

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

Президент заранее определяет, какая ответственность будет делегирована (присутствовать на похоронах), какие параметры будут приняты (соболезнования, добрые слова), и какую ценность он надеется вернуть (добрую волю). Затем он назначает конкретное лицо на эту делегированную ответственность в "время исполнения", когда ход его президентства прогрессирует.

При программировании Сценарий:. Вы часто сталкиваетесь с ситуациями, когда вам нужно выполнить определенное действие, но вы не знаете в продвинуть какой метод или даже тот объект, который вы хотите вызвать для его выполнения.

Пример:. Кнопка может не знать, какой объект или объекты необходимо уведомить. Вместо того, чтобы подключать кнопку к конкретному объект, вы подключите кнопку к делегату, а затем разрешите которые делегируют конкретный метод при выполнении программы.

Ответ 3

Одно общее использование делегатов для общих списков осуществляется через делегаты Action (или его анонимный эквивалент) для создания однострочной операции foreach:

myList.Foreach( i => i.DoSomething());

Я также нашел делегата Predicate весьма полезным при поиске или обрезке списка:

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");

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

Ответ 4

Связывание событий с обработчиками событий обычно является вашим первым знакомством с делегатами... Возможно, вы даже не знаете, что используете их, потому что делегат завершен в классе EventHandler.

Ответ 5

Если вам интересно увидеть, как шаблон Delegate используется в реальном коде, посмотрите не более, чем Cocoa на Mac OS X. Cocoa - это предпочтительный набор инструментов UI для программирования в Mac OS X и закодирован в Objective C. Он сконструирован так, что каждый компонент пользовательского интерфейса предназначен для расширения посредством делегирования, а не подкласса или других средств.

Для получения дополнительной информации я рекомендую проверить, что Apple должна сказать о делегатах здесь.

Ответ 6

У меня был проект, который использовал win32 Python.

По разным причинам некоторые модули использовали odbc.py для доступа к БД и другим модулям - pyodbc.py.

Возникла проблема, когда функция должна была использоваться обоими типами модулей. У него был объект подключения, переданный ему как аргумент, но затем он должен был знать, следует ли использовать dbi.dbiDate или datetime для представления времени.

Это объясняется тем, что ожидаемый odbc.py, как значения в операторах SQL, датируется как dbi.dbiDate, тогда как pyodbc.py - ожидаемые значения datetime.

Еще одно осложнение заключалось в том, что объекты соединения, созданные odbc.py и pyodbc.py, не позволяли устанавливать дополнительные поля.

Моим решением было обернуть объекты соединения, возвращенные odbc.odbc(...) и pyodbc.pyodbc(...) классом делегата, который содержит желаемую функцию представления времени как значение дополнительного поля, и который делегирует все другие запросы поля исходному объекту соединения.

Ответ 7

У меня был тот же вопрос, что и вы, и я отправился на этот сайт для ответа.

По-видимому, я не понял это лучше, хотя я просматривал примеры в этой теме.

Я нашел большое применение для делегатов сейчас, когда прочитал: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Это может показаться более очевидным для новых пользователей, потому что Forms намного сложнее передавать значения, чем веб-сайты ASP.NET с POST/GET (QueryString)..

В основном вы определяете делегат, который принимает текст TextBox как параметры.

//Form1

// Class Property Definition
public delegate void delPassData(TextBox text);


// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
     Form2 frm= new Form2();
     delPassData del=new delPassData(frm.funData);
     del(this.textBox1);
     frm.Show();
}

//РЕЗЮМЕ: определение делегата, создание нового класса Form2, назначение функции funData() для делегирования, передача в текстовое поле делегату. Показать форму.

//Form2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

//SUMMARY: просто возьмите TextBox txtForm1 в качестве параметров (как определено в вашем делетете) и назначьте текст меток текстовому тексту.

Надеюсь, это просвещает какое-то использование делегатов:)..

Ответ 8

Быстрый поиск в Google придумал http://en.wikipedia.org/wiki/Delegation_pattern. В принципе, в любое время, когда вы используете объект, который перенаправляет его на другой объект, вы делегируете.