为什么不能从声明类的外部调用事件或设置它们的调用列表

3

面试问题:为什么不能在声明类之外调用事件并设置它们的调用列表?

我在这篇文章Events Invocation中找到了对第一个问题的解释。

我认为第二部分的答案与安全有关。还有其他考虑因素吗?

3个回答

6

面试官可能会寻找的关键词是封装

事件只应向潜在订阅者公开订阅取消订阅操作。调用实际上是暴露事件的类的责任。

还要注意,public event EventHandler FooBar; 是下面语法的缩写:

private EventHandler _fooBar;

public event EventHandler FooBar
{
    add
    {
        _fooBar = (EventHandler)Delegate.Combine(_fooBar, value);
    }
    remove
    {
        _fooBar = (EventHandler)Delegate.Remove(_fooBar, value);
    }
}

请查看 事件访问器(Event Accessors)

实际上,委托与事件使用相同的名称--这是我讨厌的惯例(在我看来,EventName(Params) 不应该直接调用委托--它应该包括适当的空值检查逻辑,因为在没有订阅者的情况下引发事件是完全合法的事情)。 - supercat

1
因为类是这些事件的所有者。
我们说,在面向对象编程中,示例应该来自于现实世界的例子。所以,如果你是一个实体,做了一个举手的动作,你会喜欢保留举手的权力还是把它交给别人?
但是,有一个 catch

有道理,但是关于设置调用列表呢? - Tamas Pataky

1
一种C#的短格式事件声明指示编译器声明一个委托类型的字段,出于不幸的历史原因,该字段被赋予与事件相同的名称。由于字段声明是由编译器生成的,而不是用户代码的一部分,因此没有办法将其范围设置为除private以外的任何其他内容。如果您希望将与事件相关联的委托或委托可访问到子类,则需要使用类似Brandon Cuff所示的形式(尽管可能要使用Interlocked.CompareExchange进行保护)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接