Кто-то может сказать мне преимущества об использовании делегата в противоположность вызыванию самой функции как показано ниже (или другими словами почему выбирают Option over Option B)? Я смотрел на чей-то код linq вчера вечером, и у них было что-то подобное Опции A, но это использовалось для возврата скомпилированного запроса linq.
Я понимаю, что первый может теперь быть роздан к другим функциям.. просто не уверенный в его практичности. BTW, я понимаю, что это не скомпилировало бы как есть.. непрокомментированный одна из функций перед регистрацией. TYIA
class Program
{
static void Main(string[] args)
{
Console.WriteLine(SayTwoWords("Hello", "World"));
Console.ReadKey();
}
// Option A
private static Func<string, string, string>
SayTwoWords = (a, b) => String.Format("{0} {1}", a, b);
// Option B
private static string SayTwoWords(string a, string b)
{
return String.Format("{0} {1}", a, b);
}
}
************ РЕДАКТИРОВАНИЕ ************
Не уверенный, если это объясняет мой вопрос лучше, но здесь является примером типа кода, который первоначально получил меня думающий об этом:
public static class clsCompiledQuery
{
public static Func<DataContext, string, IQueryable<clsCustomerEntity>>
getCustomers = CompiledQuery.Compile((DataContext db, string strCustCode)
=> from objCustomer in db.GetTable<clsCustomerEntity>()
where objCustomer.CustomerCode == strCustCode
select objCustomer);
}
Там какое-либо преимущество к записи функции таким образом?
В опубликованном вами коде нет никаких преимуществ. В вашем коде использование делегата просто добавляет сложности, а также дополнительных затрат времени выполнения, поэтому вам лучше просто вызвать метод напрямую.
Однако у делегатов есть много применений. «Переход» к другим методам - это основное использование, хотя сохранение функции и ее последующее использование также очень полезно.
LINQ полностью построен на этой концепции. Когда вы это делаете:
var results = myCollection.Where(item => item == "Foo");
Вы передаете делегат (определенный как лямбда: item => item == "Foo"
) функции Where
в библиотеках LINQ. Это то, что заставляет его работать правильно.
вы можете использовать делегаты как "указатели функций", так что вы можете передавать функции или "действия" другим функциям для выполнения.
что также было бы интересно с делегатами, так это возможность "прекомпиляции", как будто вы "строите" новую функцию и затем возвращаете эту функцию в ваше приложение
Очень полезная функция делегатов состоит в том, что вы можете отправлять их куда хотите. Это как если бы ваша функция была везде, где вам это нужно. Большое применение для этого - обработка событий. Допустим, у вас есть кнопка, и когда пользователь нажимает на нее, вы хотите, чтобы вызывалось любое количество функций. Если подумать, есть несколько способов сделать это:
Вы могли бы: Вызов функции, которая вызывает друг друга функции, которые вы хотите вызвать. Это означает, что для каждой новой функции, которую вы хотите вызвать, вы должны жестко закодировать ее в этой функции. Очень назойливый.
ИЛИ У вас может быть общедоступный список имен каждой функции, которую вы хотите вызвать (делегатов), и любой может добавлять или удалять эти функции в любое время, при этом владелец события щелчка не должен знать или даже выполнять какую-либо работу в отношении любой из них. . Когда происходит событие щелчка, каждое событие в списке вызывается и отправляет одни и те же параметры, и все готово.
Это полезно, только если вам нужно передать делегата. Если вы можете разрешить функцию во время компиляции, это будет менее полезно.
В статическом методе вы должны передать все необходимые переменные.
С помощью делегата вы можете встроить свою реализацию и получить доступ к переменным в области видимости.