Действие <T> по сравнению с событием делегата

Я видел, что разработчики используют ниже кодов вполне альтернативно. Каково точное различие между ними, и которые идут стандартом? Они - то же, как 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));
}
58
задан Bhaskar 17 February 2010 в 16:36
поделиться

7 ответов

Кстати, ни один из примеров не использует стандартные соглашения .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<> - это лучший способ. Что отвечает на ваш вопрос.

51
ответ дан 24 November 2019 в 18:51
поделиться

Да, Action и Func - это просто удобные делегаты, определенные в clr 3.5.

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

В них нет ничего волшебного. Несколько человек написали простые библиотеки дополнений 2.0, чтобы добавить эту функциональность в код 2.0.

4
ответ дан 24 November 2019 в 18:51
поделиться

Да, Action и Func являются просто удобными делегатами, которые были определены в 3.5 clr.

Action, Func и lambdas - это просто синтаксический сахар и удобство использования делегатов.

В них нет ничего волшебного. Несколько человек написали простые библиотеки 2.0 addon, чтобы добавить эту функциональность в код 2.0.

-121--988037-

Действие < T > точно такое же, как delegate void... (T t)

Func < T > в точности совпадает с делегатом T... ()

-121--988035-

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

4
ответ дан 24 November 2019 в 18:51
поделиться

В общем, они эквивалентны. Но в контексте использования делегата для типа события соглашение заключается в использовании 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));
    }
}
3
ответ дан 24 November 2019 в 18:51
поделиться

Вы могли бы написать эти универсальные делегаты Action и Func сами, но, поскольку они обычно полезны, они написали их для вас и вставили в библиотеки .Net.

0
ответ дан 24 November 2019 в 18:51
поделиться

Действие точно такое же, как делегат void ... (T t)

Func в точности совпадает с делегатом T ... ()

22
ответ дан 24 November 2019 в 18:51
поделиться

Action - это просто сокращение для полного объявления делегата.

public delegate void Action<T>(T obj)

http://msdn.microsoft.com/en-us/library/018hxwa8.aspx

Какой из них использовать, зависит от стандартов/стиля кодирования вашей организации.

6
ответ дан 24 November 2019 в 18:51
поделиться
Другие вопросы по тегам:

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