事件,代表vs行动

本文关键字:行动 vs 代表 事件 | 更新日期: 2023-09-27 18:10:14

我想知道下面的所有选项是否可行。我完全理解委托和事件的用法,但是Action似乎提供了语法糖,使它更容易(或者我错过了什么)?我已经测试了所有这些模式,它们都有效,但这并不意味着它们都是好的模式。

public delegate WorkCompleteDel(sting value);
public class MyClass{
    //Are these all viable, safe options?
    //ties the above delegate, pretty standard pattern
    public event WorkCompleteDel WorkCompletedDelEvent;
    //OR
    //this seems to be the easiest but only supports
    //on listner/subscriber. IF thats all you need, seems
    //reasonble?
    public Action<string> WorkCompleteHandler1 {get; set;}

    //OR
    //this is similar to the one below it but 
    //uses an action. Not sure if using he event keyword
    //now gives me the ability to have multple subscibers
    //(but I think it does due to multicast delegate class)
    public event Action<string> WorkCompleteHandler1;

    //OR
    //another standard patthen
    public event EventHandler<MyEventHandlerArgs> WorkCompleteHandler2

}
public class MyEventHandlerArgs: EventArgs
{
    public string MyString {get; set}
}

事件,代表vs行动

Action<T>只是使用委托的一种简单的通用方式。它等于delegate MyDelegate(T arg)添加它是为了节省你的输入,它确实为读者节省了很多麻烦,当你试图弄清楚你的委托使用什么作为参数时。

event关键字有特殊含义。它可以防止在类之外触发此委托。关于event为什么重要以及何时使用(或不使用)的讨论,请参阅这个出色的答案。