考虑我们有一个与事件声明的类:
public class FooBar
{
public event EventHandler FooBarEvent;
}
尽管事件的"公共性",但我们无法从外部拨打FooBarEvent.Invoke
。
这是通过以下方法将课程莫迪夫(Modyf)莫迪夫(Modyf)克服的:
public class FooBar
{
public event EventHandler FooBarEvent;
public void RaiseFooBarEvent(object sender, EventArgs eventArguments)
{
FooBarEvent.Invoke(sender, eventArguments);
}
}
为什么仅通过添加和删除听众来限制外面的公共事件?
定义 public
事件仅使消费者能够订阅和取消订阅。举起活动的能力仅限于声明该事件的类型层次结构。
允许所有订户也能够提高事件会有些混乱。想象一下,例如,我有一个TextBox
类,该类有Focused
事件。如果任何旧消费者可以提出事件,那么当TextBox
类实际上并不专注时,Focused
事件很容易发射。这将使在活动期间几乎不可能保持任何类型的不变。
我个人认为这是为了正确传达整个事件架构背后的设计原理。
事件的目的是通知听众在给定对象中发生的该事件。
提出不属于您的课堂事件有什么意义?
这就是事件的目的。如果您想公开调用它,则可能需要delegates
而不是events
事件给出封装,
- 它可以防止其他类分配任何东西
- 它可以防止将其作为参数传递给方法
- 它可以防止将其分配给任何变量
- 它可以防止从其他类调用它(甚至派生的类都无法访问它)
- etc
public
可访问性告诉它可以从任何地方订阅,而不是从任何地方调用。
您问题的答案是
当对象发生一些有趣的事情时,C#中的一个事件是一种班级向客户提供通知的方式。
从外部调用事件是没有意义的,因此不允许。
我认为您应该改变事件的工作方式。其他类不应"拥有"事件并触发事件。通过"订阅"聆听"事件的类,并在此事件发生时采取一定的操作。
这就是语言定义的方式 - 事件只能由拥有类触发。如果您必须从另一个类别启动它,请让拥有类定义将开除事件的公共方法:
public FireFooBarEvent (object sender, EventArgs args)
{
if(FooBarEvent != null)
FooBarEvent(sender, args);
}
并从任何类调用此方法。