Каковы места реального мира, которые требуют делегатов? Мне любопытно, какие ситуации или шаблоны присутствуют, когда этот метод является лучшим решением. Не требуется код.Где я могу использовать делегатов?
ответ
Делегат является именованным типом, который определяет конкретный вид метода. Так же, как определение класса определяет все члены для данного типа объекта, который он определяет, делегат определяет сигнатуру метода для определенного метода, который он определяет.
Основываясь на этом утверждении, делегат является указателем на функцию, и он определяет, как выглядит эта функция.
Отличным примером для применения в реальном мире делегата является Predicate. В примере из ссылки вы заметите, что Array.Find берет массив для поиска, а затем предикат для определения критериев поиска. В этом случае он передает метод ProductGT10, который соответствует сигнатуре Predicate.
Связывание событий с обработчиками событий обычно является вашим первым знакомством с делегатами ... Возможно, вы даже не знали, что используете их, потому что делегат завершен в классе EventHandler.
Быстрый поиск по Google пришел с этим http://en.wikipedia.org/wiki/Delegation_pattern. В принципе, в любое время, когда вы используете объект, который перенаправляет его на другой объект, вы делегируете.
Если вам интересно посмотреть, как шаблон делегата используется в реальном коде, посмотрите не дальше, чем Cocoa в Mac OS X. Cocoa - это предпочтительный набор инструментов для пользовательского интерфейса Apple для программирования под Mac OS X и закодирован в Цель C. Он разработан так, что каждый компонент пользовательского интерфейса предназначен для расширения посредством делегирования, а не подкласса или других средств.
Для получения дополнительной информации я рекомендую проверить, что Apple может сказать о делегатах here.
Одно общего использование делегатов для общих списков, с помощью делегатов действий (или его анонимного эквивалента), чтобы создать операцию Еогеаспа однострочный:
myList.Foreach(i => i.DoSomething());
Я также найти предикат делегат весьма полезный в поиске или обрезке a Список:
myList.FindAll(i => i.Name == "Bob");
myList.RemoveAll(i => i.Name == "Bob");
Я знаю, что вы сказали, что никакого кода не требуется, но мне легче выразить свою полезность с помощью кода. :)
У меня был проект, который использовал 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 (...) классом делегата, который содержит желаемую функцию представления времени как значение дополнительного поля , и который делегирует все другие запросы поля исходному объекту соединения.
У меня был тот же вопрос, что и вы, и отправился на этот сайт для ответа.
По-видимому, я не понимал этого лучше, хотя я просматривал примеры этой темы.
Я нашел большое применение для делегатов теперь, когда я прочитал: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 в.
Я надеюсь, что это просвещает некоторое использование на делегатов :) ..
Как указано в "Learning C# 3.0: Master the fundamentals of C# 3.0"
Общие Сценарий: Когда умирает глава государства, президент Соединенных Штатов, как правило, делает не успели побывать на похоронах лично. Вместо этого он направляет делегата. Часто этот делегат вице-президент, но иногда вице-президент недоступен, и президент должен отправить кого-то еще, например госсекретаря или , даже первой леди. Он не хочет «устраивать» делегированные ему полномочия одному человеку; он может делегировать эту ответственность всем, кто может выполнить правильный международный протокол.
Председатель заранее определяет, какая ответственность будет делегирована (присутствовать на похоронах), какие параметры будут передаваться (соболезнования добрых слов), и какое значение он надеется вернуться (добрая воля). Затем он назначает определенное лицо на эту делегированную ответственность в размере «время выполнения» по мере продвижения курса его президентства.
В программировании Сценарий: Вы часто сталкиваются с ситуациями, когда необходимо выполнить определенное действие, но вы не знаете, в заранее, какой метод или даже какой объект вы хотите призвать для его выполнения.
Возможно, вы не знаете, какой объект или объекты необходимо уведомить. Вместо того, чтобы подключать кнопку к определенному объекту , вы подключите эту кнопку к делегату, а затем разрешите , который делегирует конкретный метод при выполнении программы.
Почему бы просто не использовать анонимные функции/lambdas? – Pacerier 2014-11-05 23:19:20
- 1. , где использовать делегатов в C#
- 2. Где я могу использовать ActionListener?
- 3. Где разместить своих делегатов. ,
- 4. Зачем использовать делегатов?
- 5. Где я могу использовать drawInRect для строк?
- 6. Где я могу использовать HAML в Octopress?
- 7. Где я могу использовать функцию jqgrid remapColumns?
- 8. Где я могу использовать Composer for PHP?
- 9. Где я могу скачать и использовать AddressBookUI.Framworks?
- 10. Могу ли я использовать сетку везде, где я хочу?
- 11. Где определены конструкторы делегатов и функции-члены?
- 12. Доктрина, MVC, Symfony: где я могу использовать Доктрину? Могу ли я использовать его в контроллере?
- 13. Где я могу сортировать?
- 14. Где я могу установить location.ini?
- 15. Где разместить делегатов в раскадровке popover
- 16. Где я могу скачать JOGL?
- 17. Где я могу найти AuthComponent.php?
- 18. где я могу получить plugin.jar
- 19. Где я могу найти edu.stanford.nlp.parser.nndep
- 20. Где я могу получить client_id?
- 21. Где я могу найти SqsListener
- 22. Где я могу расширить AsyncTask?
- 23. Где я могу найти ESAPI.properties?
- 24. Где я могу найти KeyGenParameterSpec.java
- 25. Как правильно использовать делегатов в Swift?
- 26. Где я могу запустить logcat?
- 27. Где я могу найти «CloudEndpointUtils»?
- 28. Где я могу установить onWindowBeforeUnload?
- 29. Где я могу определить Enums?
- 30. Где я могу найти ntohl
Либо метод класса Form2 должен быть назван funData (вместо passData), либо назначение функции Form1 должно быть названо frm.passData (вместо frm.funData). – ethan 2018-02-05 17:16:38