考虑我们有一个声明了事件的类:
public class FooBar
{
public event EventHandler FooBarEvent;
}
尽管事件“公开”,但我们无法从外部致电FooBarEvent.Invoke
。
通过使用以下方法来训练课程,克服了这一点:
public class FooBar
{
public event EventHandler FooBarEvent;
public void RaiseFooBarEvent(object sender, EventArgs eventArguments)
{
FooBarEvent.Invoke(sender, eventArguments);
}
}
为什么只通过添加和删除侦听器来限制访问外部公共事件?
答案 0 :(得分:5)
定义public
事件只会让消费者能够订阅和取消订阅。引发事件的能力仅限于声明事件的类型层次结构。
允许所有订阅者也能够举起活动会有点混乱。想象一下,例如我有一个TextBox
类,其中有Focused
个事件。如果任何旧的消费者可以举起活动,那么当Focused
课程实际上没有集中时,TextBox
事件很容易被触发。这将使得在事件期间几乎不可能维持任何类型的不变量。
答案 1 :(得分:3)
我个人认为这样做是为了正确传达整个事件架构背后的设计原则。
事件的目的是通知听众在给定对象中发生的所述事件。
提出不属于你的课程的重点是什么?
答案 2 :(得分:2)
这就是事件的用途。如果您想公开调用它,则可能需要delegates
而不是events
事件提供封装,
public
辅助功能表示可以从任何地方订阅,而不是从任何地方调用。
答案 3 :(得分:1)
我认为你应该改变你对事件如何运作的看法。其他类不应该“拥有”事件并触发它。通过“订阅”来“监听”事件的类,并在发生此事件时执行某个操作。
答案 4 :(得分:1)
答案 5 :(得分:0)
这就是定义语言的方式 - 事件只能由拥有的类触发。如果必须从其他类触发它,请让拥有类定义一个将触发事件的公共方法:
public FireFooBarEvent (object sender, EventArgs args)
{
if(FooBarEvent != null)
FooBarEvent(sender, args);
}
从任何一个班级调用此方法。