为什么不能直接调用公共事件



考虑我们有一个与事件声明的类:

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

事件给出封装,

  1. 它可以防止其他类分配任何东西
  2. 它可以防止将其作为参数传递给方法
  3. 它可以防止将其分配给任何变量
  4. 它可以防止从其他类调用它(甚至派生的类都无法访问它)
  5. etc

public可访问性告诉它可以从任何地方订阅,而不是从任何地方调用

您问题的答案是

当对象发生一些有趣的事情时,C#中的一个事件是一种班级向客户提供通知的方式。

从外部调用事件是没有意义的,因此不允许。

我认为您应该改变事件的工作方式。其他类不应"拥有"事件并触发事件。通过"订阅"聆听"事件的类,并在此事件发生时采取一定的操作。

这就是语言定义的方式 - 事件只能由拥有类触发。如果您必须从另一个类别启动它,请让拥有类定义将开除事件的公共方法:

public FireFooBarEvent (object sender, EventArgs args)
{
   if(FooBarEvent != null)
      FooBarEvent(sender, args);
}

并从任何类调用此方法。

相关内容

  • 没有找到相关文章

最新更新