代码之家  ›  专栏  ›  技术社区  ›  Marcel Gosselin

为什么在没有订阅者的情况下,委托为null而不是空列表?

  •  10
  • Marcel Gosselin  · 技术社区  · 16 年前

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

    4 回复  |  直到 16 年前
        1
  •  8
  •   SLaks    16 年前

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

    string MyField 默认为 null 而不是 "" Action MyField 默认为 而不是空的 Action 例子

        2
  •  3
  •   Andrew Hare    16 年前

    我同意这可能很麻烦,我个人认为这是一个错误。我想不出为什么会这样。

        3
  •  2
  •   Community Mohan Dere    9 年前
        4
  •  0
  •   supercat    14 年前

    在运行时使用null处理空列表是有效的,特别是因为绝大多数事件都有零个或一个订阅者。C#的缺陷不是使用 null

    1. 订阅
    2. 调用(如果非空,则应调用_eventName,否则什么都不做)

    _eventName 与要求用户代码复制事件委托、测试是否为空以及调用副本(如果不是)相比,这样的设计将节省无数(如果不是数百万)行代码。