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)
不应该是直接委托调用——它应该包括适当的空检查逻辑,因为在没有订阅者的情况下引发事件是完全合法的)。