2

面试题:为什么不能从声明类的外部调用事件及其调用列表?

我在这篇文章事件调用中找到了问题第一部分的解释

我认为第二部分的答案在于安全性。还有其他原因考虑吗?

4

3 回答 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);
    }
}

查看事件访问器

于 2013-05-29T17:07:39.537 回答
1

因为类是这些事件的所有者。

我们说 OOPS 中的示例应该取自现实世界的示例。因此,如果您是一个实体,并且您进行举手举手的活动,您是想保留自己举手的权力还是给别人?

但是有一个问题

于 2013-05-29T16:59:07.607 回答
1

AC# 短格式事件声明指示编译器声明委托类型的字段,由于不幸的历史原因,该字段被赋予与事件相同的名称。因为字段声明是由编译器生成的,而不是用户代码的一部分,所以没有任何方法可以将其范围设置为private. 如果您希望子类可以访问与事件相关联的一个或多个委托,那么有必要使用类似于 Brandon Cuff 显示的表单(尽管可能用 保护Interlocked.CompareExchange)。

于 2013-07-02T22:28:26.517 回答