2008-08-28 3 views

ответ

29

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

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

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

11

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

0

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

4

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

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

15

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

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

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

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

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

4

У меня был проект, который использовал 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 (...) классом делегата, который содержит желаемую функцию представления времени как значение дополнительного поля , и который делегирует все другие запросы поля исходному объекту соединения.

3

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

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

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

Это может показаться более очевидным для новых пользователей, потому что формы гораздо сложнее передавать значения, чем веб-сайтов 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 функции() делегировать, передать в вашем TextBox к делегату. Показать форму.

// Form2

public void passData(TextBox txtForm1) 
{ 

    label1.Text = txtForm1.Text; 
} 

// РЕЗЮМЕ: Просто возьмите TextBox txtForm1 в качестве параметров (как определено в делегата) и присвоить текст подписи к тексту TextBox в.

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

+0

Либо метод класса Form2 должен быть назван funData (вместо passData), либо назначение функции Form1 должно быть названо frm.passData (вместо frm.funData). – ethan 2018-02-05 17:16:38

139

Как указано в "Learning C# 3.0: Master the fundamentals of C# 3.0"

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

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

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

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

+1

Почему бы просто не использовать анонимные функции/lambdas? – Pacerier 2014-11-05 23:19:20

Смежные вопросы