为什么当没有订阅者时,委托是null而不是空列表?

10

能否有人解释一下为什么.NET框架团队决定委托没有订户时应该是null,而不是一个带有空InvocationList的对象?我想知道导致这个决定的基本原理。

void DoSomething()
{
    EventHandler handler = SomeEvent;
    if(handler != null)                   //why is this null-check necessary?
    {
        handler(this, EventArgs.Empty);
    }
}

感谢

4个回答

9

在CLR级别上,委托字段和事件字段是常规字段。

就像string MyField默认为null而不是"",同样Action MyField默认为null而不是一个空的Action实例。


4

我同意这可能很繁琐,个人认为这是一个错误。我想不出为什么必须这样做。


2

查看Jon Skeet在这里的回答,对此进行了很好的讨论。在C# 2.0中甚至可以避免检查null的情况。


0

使用 null 处理空列表在运行时非常高效,特别是由于绝大多数事件只有零个或一个订阅者。C# 中的缺陷不在于使用 null 来处理空列表,而在于许多情况下事件名称指的是委托而不是事件本身。更好的设计应该在委托名称前加上下划线或其他前缀,然后只允许使用特定的事件名称进行以下操作:

  1. 订阅
  2. 取消订阅
  3. 调用(如果 _eventName 不为空,则调用 _eventName,否则不执行任何操作)

对于所有其他事件操作,必须使用 _eventName。这样的设计将节省无数行代码(如果不是数百万行),与要求用户代码复制事件委托、测试是否为空并在不为空时调用副本相比。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,