2010-09-20 5 views
6

Делегатам C# всегда было трудно понять, и поэтому я был очень счастлив споткнуться через logicchild's article on The Code Project web site titled "C# Delegates: Step by Step". Он очень лаконично объясняет делегатов C#, и я могу порекомендовать его вам. Тем не менее, в попытке из примеров, я вижу, что два способа инициализации делегата, в основном:Что такое «правильный» способ инициализации делегата 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; 
    } 
} 

Итак, каков «правильный» способ и почему?

ответ

7

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

3

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

+6

Whoa. Множество преступлений совершается «ради удобочитаемости», и среди них заметным является длинный, сложный код, а не четкий и сжатый код. Это противоположность читаемости. –

+0

fun Я использую второй для удобочитаемости. Просто идет, чтобы показать, что читаемость субъективна. –

+1

@ Konrad, long не автоматически равномерно запутан. И короткий не является автоматически равным читабельному. RegEx приходит на ум ... Дело в том, что «более длинный» путь более точно следует за тем, как все работает на C#. Более короткий путь потенциально запутан. Я бы вряд ли назвал CalculationHandler sumHandler1 = new CalculationHandler (math.Sum); преступление. – colithium

0

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

1

Оба правильные.

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

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

1

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

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

Смежные вопросы