Каков «правильный» способ инициализации делегата C #? - PullRequest
8 голосов
/ 20 сентября 2010

C # делегатов всегда было трудно понять, поэтому я был очень рад наткнуться на статью logicchild на веб-сайте Code Project под названием «C # Delegates: Step by Step» . У него очень лаконичный способ объяснить делегатам C #, и я могу рекомендовать его вам. Однако, пробуя примеры, я вижу, что есть два способа инициализации делегата, в основном:

    //create a new instance of the delegate class
    CalculationHandler sumHandler1 = new CalculationHandler(math.Sum);
    //invoke the delegate
    int result = sumHandler1(8, 9);
    Console.WriteLine("Result 1 is: " + result);

и

    CalculationHandler sumHandler2 = math.Sum;
    //invoke the delegate
    int result = sumHandler2(8, 9);
    Console.WriteLine("Result 2 is: " + result);

где математический класс определяется как

public class math
{
    public int Sum(int x, int y)
    {
        return x + y;
    }
}

Так какой же «правильный» путь и почему?

Ответы [ 5 ]

9 голосов
/ 20 сентября 2010

Они оба верны, но преобразование группы методов , то есть второй вариант, было добавлено в 2.0 (IIRC). То есть Если вы используете старую версию компилятора, вам нужно использовать первый вариант. В противном случае лишняя типизация действительно избыточна.

3 голосов
/ 20 сентября 2010

Я всегда использую первый метод для удобства чтения. Второй вариант создает впечатление, что math.Sum является свойством и возвращает результат, который представляет собой CalculationHandler. Лично я думаю, что это сбивает с толку.

1 голос
/ 20 сентября 2010

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

КакПримечание: VS предоставит вам первую версию, если вы используете автозаполнение с регистрацией обработчика событий.Resharper будет использовать второй и пометить часть кода в первой версии как избыточную.

1 голос
/ 20 сентября 2010

Оба верны.

Второй - это ярлык, предоставленный компилятором, оба фактически создают код первого.

Первый показывает более ясно, что происходит на самом делев то время как второй код меньше, поэтому его легче читать (если вы понимаете, что на самом деле происходит).

0 голосов
/ 20 сентября 2010

Оба способа в порядке, короткая версия - это просто служба компилятора C #.Первый способ более многословен и показывает, что именно происходит.Обе версии создают один и тот же код IL, который фактически близок к первой версии.

...