我一直在研究我的一本c#书,我刚刚看到一篇关于C#中事件的句子:事件的主要目的是防止订阅者互相干扰。
无论它意味着什么,是的,事实上事件的工作方式与代表一样。我一直想知道为什么我应该使用事件代替代表。
那么有没有人可以解释这个大胆的部分?
提前致谢。
答案 0 :(得分:14)
选择不是真正在委托和事件之间 - 它们是完全不同的东西。但是,您可以公开具有委托类型的公共属性或公共字段。我认为这就是你的意思。
假设Button.Click
是公共字段或属性而不是事件。然后,一段代码可以订阅一个事件,然后另一段代码可以写:
// Invalid with events, valid with properties
button.Click = null;
因此消灭了原始事件处理程序。同样,其他代码也可以调用事件处理程序:
// Invalid with events, valid with properties
button.Click(this, EventArgs.Empty);
即使没有点击按钮。这显然违反了封装。将Click
公开给其他代码的唯一原因是允许他们注册对按钮点击的兴趣并在以后注册不感兴趣 - 这些正是事件所提供的能力。
将事件视为围绕两种方法的语法糖。例如,如果我们没有事件,那么Button
可能会有:
public void AddClickHandler(EventHandler handler)
public void RemoveClickHandler(EventHandler handler)
对封装的侵犯消失了,但是你失去了一些便利 - 每个人都必须编写自己的方法。事件基本上简化了这种模式。
答案 1 :(得分:10)
事件只能由定义它的类调用,而委托可以从有权访问它的任何人调用。这就是我认为粗体文本的含义。
此外,可以在接口中定义事件,而委托则不能(因为您将委托声明为字段)。
我建议给this link一个阅读,因为它解释得非常好,除了上面提到的以外还有一些例子。
答案 2 :(得分:3)
您可以将委托设置为NULL,这会导致它“忘记”订阅它的每个函数。
答案 3 :(得分:0)
您可以根据需要为活动添加尽可能多的事件处理程序。