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

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

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

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

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

Как указано в «Learning C # 3.0: Изучите основы C # 3.0»

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Форма1

 // 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(); } 

// SUMMARY: Определить делегат, создать экземпляр нового classа Form2, назначить функцию funData () для делегирования, передать в свой текстовый блок делегату. Показать форму.

// Форма 2

 public void passData(TextBox txtForm1) { label1.Text = txtForm1.Text; } 

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

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

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

Давайте будем гением компьютера.