C# 为什么可以';不能从声明类外部调用事件或设置其调用列表

C# 为什么可以';不能从声明类外部调用事件或设置其调用列表,c#,.net,events,C#,.net,Events,采访问题:为什么不能从声明类外部调用事件并设置它们的调用列表 我在这篇文章中找到了问题第一部分的解释 我认为第二部分的答案在于安全。 还有其他原因吗?因为类是这些事件的所有者 我们说OOPS中的例子应该取自真实世界的例子。所以,如果你是一个实体,并且你做了一件事,比如举手,你想保持自己举手的权威,还是把它交给别人 但是有一个你的面试官可能要找的关键词是封装 事件只应向潜在订阅者公开订阅和取消订阅操作。调用实际上是公开事件的类的责任 还要记住,public EventHandler FooBar是

采访问题:为什么不能从声明类外部调用事件并设置它们的调用列表

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

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

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

我们说OOPS中的例子应该取自真实世界的例子。所以,如果你是一个实体,并且你做了一件事,比如举手,你想保持自己举手的权威,还是把它交给别人


但是有一个

你的面试官可能要找的关键词是封装

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

还要记住,
public EventHandler FooBar
是以下语法的缩写形式

private EventHandler _fooBar;

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

请参见

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

有意义,但是设置调用列表呢?实际上,委托的名称与事件的名称相同——我讨厌这种约定(IMHO,
EventName(Params)
不应该是直接委托调用——它应该包括适当的空检查逻辑,因为在没有订阅者的情况下引发事件是完全合法的)。