面试题:为什么不能从声明类的外部调用事件及其调用列表?
我在这篇文章事件调用中找到了问题第一部分的解释
我认为第二部分的答案在于安全性。还有其他原因考虑吗?
面试官可能正在寻找的关键词是封装。
事件只应该向潜在订阅者公开订阅和取消订阅操作。调用实际上是公开事件的类的责任。
另请记住,这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);
}
}
查看事件访问器
AC# 短格式事件声明指示编译器声明委托类型的字段,由于不幸的历史原因,该字段被赋予与事件相同的名称。因为字段声明是由编译器生成的,而不是用户代码的一部分,所以没有任何方法可以将其范围设置为private
. 如果您希望子类可以访问与事件相关联的一个或多个委托,那么有必要使用类似于 Brandon Cuff 显示的表单(尽管可能用 保护Interlocked.CompareExchange
)。