为什么公共事件不能直接在外面调用?

时间:2014-01-21 12:50:28

标签: c# delegates event-handling encapsulation

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

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);
    }
}

为什么只通过添加和删除侦听器来限制访问外部公共事件?

6 个答案:

答案 0 :(得分:5)

定义public事件只会让消费者能够订阅和取消订阅。引发事件的能力仅限于声明事件的类型层次结构。

允许所有订阅者也能够举起活动会有点混乱。想象一下,例如我有一个TextBox类,其中有Focused个事件。如果任何旧的消费者可以举起活动,那么当Focused课程实际上没有集中时,TextBox事件很容易被触发。这将使得在事件期间几乎不可能维持任何类型的不变量。

答案 1 :(得分:3)

我个人认为这样做是为了正确传达整个事件架构背后的设计原则。

事件的目的是通知听众在给定对象中发生的所述事件。

提出不属于你的课程的重点是什么?

答案 2 :(得分:2)

这就是事件的用途。如果您想公开调用它,则可能需要delegates而不是events

事件提供封装,

  1. 它阻止其他类分配任何内容
  2. 它阻止将其作为参数传递给方法
  3. 它可以防止将其分配给任何变量
  4. 它阻止从另一个类调用它(甚至派生类都没有访问它)
  5. public辅助功能表示可以从任何地方订阅,而不是从任何地方调用

答案 3 :(得分:1)

我认为你应该改变你对事件如何运作的看法。其他类不应该“拥有”事件并触发它。通过“订阅”来“监听”事件的类,并在发生此事件时执行某个操作。

答案 4 :(得分:1)

你问题的answer

  

C#中的事件是一种类,当一个对象发生一些有趣的事情时,它可以向该类的客户端提供通知。

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

答案 5 :(得分:0)

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

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

从任何一个班级调用此方法。