事件、委托和 Actions<T> 有何区别?

4

我正在尝试理解以下所有选项是否可行。我完全理解委托和事件的使用,但是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}

}

重要的是要使用event关键字。如果不这样做,单个消费者可以清除所有其他订阅者(如果他们想要的话)。这里 有一个关于ActionEventHandler的问题。 - Jonesopolis
我不会把Action称为语法糖,它只是一种类型,但它确实节省了一些输入。而且使用ActionFunc时,你很少需要声明委托类型。 - Brian Rasmussen
谢谢。所以如果我理解正确的话,如果您对时机和消费者的数量有完全的控制(例如简单的桌面应用程序),您可以省略事件关键字。然而,这并不是一种被广泛接受的模式。 - Bob Lautenbach
1个回答

8
Action<T>是一种使用委托的简单通用方式。它相当于delegate MyDelegate(T arg)。它被添加是为了节省您的输入时间,同时也能让读者更轻松地理解您的委托所使用的参数。 event关键字有特殊的含义。它防止此委托在类外部被触发。请参见这个优秀的答案以了解为什么event很重要,以及何时使用它(或不使用)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接