Делегат Func по сравнению с функцией

Кто-то может сказать мне преимущества об использовании делегата в противоположность вызыванию самой функции как показано ниже (или другими словами почему выбирают 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);
}

Там какое-либо преимущество к записи функции таким образом?

12
задан Brewha 25 June 2010 в 12:23
поделиться

5 ответов

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

Однако у делегатов есть много применений. «Переход» к другим методам - ​​это основное использование, хотя сохранение функции и ее последующее использование также очень полезно.

LINQ полностью построен на этой концепции. Когда вы это делаете:

var results = myCollection.Where(item => item == "Foo");

Вы передаете делегат (определенный как лямбда: item => item == "Foo" ) функции Where в библиотеках LINQ. Это то, что заставляет его работать правильно.

13
ответ дан 2 December 2019 в 06:25
поделиться

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

что также было бы интересно с делегатами, так это возможность "прекомпиляции", как будто вы "строите" новую функцию и затем возвращаете эту функцию в ваше приложение

1
ответ дан 2 December 2019 в 06:25
поделиться

Очень полезная функция делегатов состоит в том, что вы можете отправлять их куда хотите. Это как если бы ваша функция была везде, где вам это нужно. Большое применение для этого - обработка событий. Допустим, у вас есть кнопка, и когда пользователь нажимает на нее, вы хотите, чтобы вызывалось любое количество функций. Если подумать, есть несколько способов сделать это:

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

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

4
ответ дан 2 December 2019 в 06:25
поделиться

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

3
ответ дан 2 December 2019 в 06:25
поделиться

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

2
ответ дан 2 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: