Вопрос по coding-style, c#, .net – C # Action / Вопрос о стиле делегата

9

Что считается лучшим стилем для определения события:

public event Action<object, double> OnNumberChanged;

или же

public delegate void DNumberChanged(object sender, double number);
public event DNumberChanged OnNumberChanged;

Первый занимает меньше времени, но делегат дает имена параметрам. Когда я набираю это, я думаю, что номер 2 - победитель, но я могу ошибаться.

Изменить: другой (третий) подход является победителем. Читай ниже.

@ Брэд Брюс, он не имеет в виду последовательность ответов, но третий метод отличается от его оригинальных 2 идей. Я перефразировал вопрос и принял ответ немного яснее. Aardvark
Как упоминалось ниже, используйте EventHandler & lt; T & gt; лучше всего для ясности. Для этого стоит использовать библиотеку, размещенную на CodePlex, которая позволит вам конвертировать использование EventHandler & lt; T & gt; Действие & lt; объект, T & gt; и наоборот. Увидетьjolt.codeplex.com/Wiki/View.aspx?title=Jolt.Functional для дополнительной информации. Steve Guidi

Ваш Ответ

5   ответов
16

Ни 1, ни 2. Третий вариант - победитель

public event EventHandler<NumberChangedEventArgs> NumberChanged;

Вы нарушаете ряд рекомендаций по стилю для разработки в C #, таких как использование типа для аргументов событий, который не расширяет EventArgs.

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

+1 для руководства по стилю. Я просто хотел бы добавить, что пользовательские EventArgs могут не понадобиться для события уведомления об изменении свойства, потому что изменение уже должно было отражаться через свойство отправителя.
11

Не создавайте новый тип, если вам это не нужно. Я думаю, что это лучше

public event Action<object, double> OnNumberChanged;

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

Согласитесь с этим, еще одна строка кода для поддержки.
2

Обычно я придерживаюсь использования производного класса EventArgs в качестве аргумента. Это делает код намного более последовательным.

У меня есть класс:

public class ApplyClickedEventArgs : EventArgs  
{  
   ...
}

и обработчик:

void cpy_ApplyClicked(object sender, ApplyClickedEventArgs e)  
{  
   ...  
}  

Декларация:

public event EventHandler<ApplyClickedEventArgs> ApplyClicked;
1

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

0

Я думаю, что вариант 1 лучше, если бы я выбрал, но IIRC, официальные правила для событий, утверждают, что ваш второй параметр должен быть класс с именемXxxEventArgsи должен иметьEventArgs в его цепочке наследования.

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

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