【问题标题】:Can an event instance field member be null (assuming it is not forcefully set to null)?事件实例字段成员可以为空吗(假设它没有被强制设置为空)?
【发布时间】:2019-08-28 18:32:38
【问题描述】:

假设我有这个作为一个类的成员:

public event EventHandler<MyObject> SomeEventThing;

为了避免可空引用警告,我必须写:

public event EventHandler<MyObject>? SomeEventThing;

这是否意味着事件字段可能为空,而我一直在玩火?或者这是一个分析器错误?

【问题讨论】:

  • 不应该在声明时初始化不可为空的引用类型吗?
  • 如果你的标题和你的问题有相同的答案会很有帮助。现在我读到标题“是否保证事件字段不为空”,然后第一个答案以“是”开头。这就像“是的,我们没有香蕉”。你能让你的问题和它的标题有相同类型的答案,要么是要么都不是?
  • @LasseVågsætherKarlsen 如果您认为问题的答案没有跟在标题后面,那么回复答案作者而不是问题作者是更好的选择,因为我无法控制人们如何回答我的问题(或者更好的是,编辑他们的答案)。无论如何,我更新了标题以满足您的要求,希望整体上使标题更好。

标签: c# c#-8.0 nullable-reference-types


【解决方案1】:

是的,类似字段的事件绝对可以为空 - 如果没有事件订阅者则为空。编译器是正确的。生成的事件代码由一个委托类型的字段作为后盾,该字段的默认值与其他引用类型的字段一样仍然为空。

请注意,使用空条件 ?. 运算符,很容易有条件地调用事件处理程序:

SomeEventThing?.Invoke(this, new EventArgs<MyObject>());

【讨论】:

  • 还要注意 EventHandlers 是不可变的;每次更新订阅者时都会创建一个全新的列表。
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2014-01-02
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多