附加功能事件提供代理

时间:2011-10-25 17:05:13

标签: c# events

据我所知,事件是一种类允许客户端为代理提供事件发生时应该调用的方法的方法。当事件发生时,将调用由其客户端提供给它的代理。

但如上面的代码所示,所述功能也可以通过委托来实现,即不使用委托。

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;

}

所以,我想知道事件提供了哪些附加功能?

3 个答案:

答案 0 :(得分:5)

  

所以,我想知道事件提供了哪些附加功能?

事件提供了两个明显不同于公开代表的优势:

  1. 你的意图非常明确。代表通常是公开曝光的,其目的与“事件”完全不同 - 通过使用事件,您非常清楚地说“这是在特定点上提升的”。公开API的代理通常具有不同的含义 - 通常,公共API中的委托是该API的必需输入 - 即:由方法直接使用的内容,而不是由触发的可选通知机制方法。
  2. 从技术上讲,事件必然只是一个代表。事件实际上可以选择允许自定义add and remove accessors,这允许您手动确定订阅者订阅或取消订阅事件时会发生什么。例如,ICommand.CanExecuteChanged的许多实现实际上根本不包括他们自己的委托 - 但silently route to the CommandManager's RequerySuggested事件。

答案 1 :(得分:0)

您的示例允许调用单个委托。 event是代表的集合,这意味着您可以+=-=离开您的心脏(即使在事件调用期间)。

答案 2 :(得分:0)

事件只是处理程序的access approach

它不允许你做myHandler=myFunc; 仅使用+=(来自外部类)

如果另一个哑巴使用你的代码 - 那么他就不会使用=破坏你的链,所以你只允许他+=-=