事件通过委托提供的附加功能

本文关键字:功能 事件 | 更新日期: 2023-09-27 18:12:27

据我所知,Event是类允许客户端将其委托给应该在事件发生时调用的方法的一种方式。当事件发生时,将调用客户端给它的委托。

但是正如下面的代码所演示的那样,上述功能也可以仅通过委托实现,即不使用委托。

class Program
{
    static void Main(string[] args)
    {
        ListWithChangedEvent lwce = new ListWithChangedEvent();
        lwce.delegateVariable = DelegateTestMethod;
        lwce.Add("test");
        Console.ReadLine();
    }
    public static void DelegateTestMethod(object sender, object e)
    {
    }
}
public delegate void ChangedEventHandler(object sender, object e);
public class ListWithChangedEvent : System.Collections.ArrayList
{
    public override int Add(object value)
    {
        int result = base.Add(value);
        if (delegateVariable != null)
            delegateVariable(this, "");
        return result;
    }
    public ChangedEventHandler delegateVariable;
}

所以,我想知道事件提供什么额外的功能?

事件通过委托提供的附加功能

所以,我想知道事件提供什么额外的功能?

与公开公共委托相比,

事件提供了两个明显不同的优势:

  1. 你的意图很明确。一个委托通常是为了一个与"事件"非常不同的目的而公开的——通过使用一个事件,你非常清楚地说"这是一个将在一个特定的点被提出的东西"。暴露委托通常有不同的含义——公共API中的委托通常是该API的必需输入——即:由方法直接使用的东西,而不是由方法触发的可选通知机制。事件,从技术上讲,不一定是只是一个委托。事件实际上具有允许自定义添加和删除访问器的选项,这允许您手动确定订阅者订阅或取消订阅事件时会发生什么。例如,iccommand的许多实现。CanExecuteChanged实际上根本不包含它们自己的委托——而是无声地路由到CommandManager的RequerySuggested事件。

您的示例允许调用单个委托。event是委托的集合,这意味着您可以随心所欲地使用+=-=(甚至在事件调用期间)。

事件只是access approach到处理程序。

它不允许你做myHandler=myFunc;只使用+= (from outer class)

如果另一个笨蛋使用你的代码,那么他不会通过使用=来破坏你的链,所以你只允许他使用+=-=