Я видел, что разработчики используют ниже кодов вполне альтернативно. Каково точное различие между ними, и которые идут стандартом? Они - то же, как Action
и Func<T>
делегат также:
public event Action<EmployeeEventAgs> OnLeave;
public void Leave()
{
OnLeave(new EmployeeEventAgs(this.ID));
}
VS
public delegate void GoOnLeave(EmployeeEventAgs e);
public event GoOnLeave OnLeave;
public void Leave()
{
OnLeave(new EmployeeEventAgs(this.ID));
}
Кстати, ни один из примеров не использует стандартные соглашения .NET. EventHandler
generic должен объявлять событие:
public event EventHandler<EmployeeEventArgs> Leave;
Префикс "On" должен быть зарезервирован для защищенного метода, который поднимает событие:
protected virtual void OnLeave(EmployeeEventArgs e) {
var handler = Leave;
if (handler != null) handler(this, e);
}
Вы не обязаны делать это именно так, но любой мгновенно узнает шаблон, поймет ваш код и будет знать, как его использовать и настраивать.
И у него есть большое преимущество - не нужно выбирать между объявлением пользовательского делегата и Action<>
, EventHandler<>
- это лучший способ. Что отвечает на ваш вопрос.
Да, Action и Func - это просто удобные делегаты, определенные в clr 3.5.
Action, Func и лямбда-выражения - это просто синтаксический сахар и удобство использования делегатов.
В них нет ничего волшебного. Несколько человек написали простые библиотеки дополнений 2.0, чтобы добавить эту функциональность в код 2.0.
Да, Action и Func являются просто удобными делегатами, которые были определены в 3.5 clr.
Action, Func и lambdas - это просто синтаксический сахар и удобство использования делегатов.
В них нет ничего волшебного. Несколько человек написали простые библиотеки 2.0 addon, чтобы добавить эту функциональность в код 2.0.
-121--988037- Действие < T >
точно такое же, как delegate void... (T t)
Func < T >
в точности совпадает с делегатом T... ()
Возможно, вы захотите посмотреть здесь , видя, что компилятор на самом деле генерирует для Action является лучшим описанием. Нет никакой функциональной разницы в том, что вы написали, просто более короткий, более удобный синтаксис.
В общем, они эквивалентны. Но в контексте использования делегата для типа события соглашение заключается в использовании EventHandler (где T наследует EventArgs):
public event EventHandler<EmployeeEventArgs> Left;
public void Leave()
{
OnLeft(this.ID);
}
protected virtual void OnLeft(int id)
{
if (Left != null) {
Left(new EmployeeEventArgs(id));
}
}
Вы могли бы написать эти универсальные делегаты Action и Func сами, но, поскольку они обычно полезны, они написали их для вас и вставили в библиотеки .Net.
Действие
точно такое же, как делегат void ... (T t)
Func
в точности совпадает с делегатом T ... ()
Action - это просто сокращение для полного объявления делегата.
public delegate void Action<T>(T obj)
http://msdn.microsoft.com/en-us/library/018hxwa8.aspx
Какой из них использовать, зависит от стандартов/стиля кодирования вашей организации.