Использование делегата - PullRequest
8 голосов
/ 16 июня 2011

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

delegate string FuncRef(string Val);

FuncRef fValue = GetFieldName;

fValue("hello");

что я здесь делаю, просто объявляю делегат и назначаем имя функции делегату и вызываем как fValue("hello"); всякий раз, когда это требуется.

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

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

Ответы [ 8 ]

5 голосов
/ 16 июня 2011

Причиной использования делегатов вместо прямого вызова функции является та же причина, по которой вы делаете

var taxRate = 0.15;
var taxAmount = income * taxRate;

вместо

var taxAmount = income * 0.15;

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

Для примеров кода, который использует делегатов, вы можете посмотреть на LINQ (конечно), но есть также пример «делегатов 101», который применим на любом языке: фильтрациясписок .

2 голосов
/ 16 июня 2011
delegate string FuncRef(string Val);

FuncRef fValue;   // class member

if (condition1)
    fValue = GetFieldName1;
else if (condition2)
    fValue = GetFieldName2;
else
    fValue = GetFieldName3;

// Another function
fValue("hello");
1 голос
/ 16 июня 2011

Учебный код Microsoft для делегатов C # представляет еще один интересный пример использования.В их примере объект с именем Bookstore имеет метод ProcessPaperbackBooks, который принимает делегата для обработки книги и применяет его к каждому элементу в классе.

Самое интересное то, что тогда, если вам нужно сказать, метод, который собираетДля всех ISBN всех книг в магазине вам не нужно ничего менять в классе книжного магазина, а нужно только определить функцию, которая действует на книги и передать ее в метод ProcessPaperbackBooks.Произойдет делегированное совершенство, и ваша новая функция будет применена к каждому предмету в книжном магазине.Фантастика, нет?

http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx

0 голосов
/ 16 июня 2011

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

0 голосов
/ 16 июня 2011

Одно место, где я использую делегаты, - это мой обработчик ввода (C #, XNA)

У меня есть делегат public void OnKeyboardPress(), который я связываю с различными функциями при нажатии определенных клавиш.

Вводхороший пример;вместо того, чтобы опрашивать его (т. е. каждое обновление, которое вы идете «оно уже готово?», вы ждете, пока оно вам позвонит)… например, графический интерфейс.События WPF являются делегатами.

0 голосов
/ 16 июня 2011

Linq для объектов широко использует делегатов:

myAnimals.Where(animal => animal.CanSwim)

параметр, предоставленный методу Where (animal => animal.CanSwim), является лямбда-выражением, которое преобразуется в делегат, который применяется ко всем элементам в myAnimals.

0 голосов
/ 16 июня 2011

Коротко: Вы можете использовать делегатов и участников событий в комбинации, чтобы иметь возможность, например, назначать обработчик событий классу, который не знает его раньше, класс кнопки знает, когда он должен вызвать событие click, и не знает все же, внутренне, вы будете привязывать к нему обработчик mybutton_Click.

0 голосов
/ 16 июня 2011

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

Асинхронный шаблон BeginInvoke / EndInvoke является прекрасным примером этого; обратный вызов указывается через делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...