【问题标题】:Is it better to return null or an empty collection?返回 null 还是空集合更好?
【发布时间】:2011-05-21 18:46:31
【问题描述】:

假设我有一个返回数组或列表或其他集合的方法。如果内部出现问题或者根本没有数据要返回,那么返回 null 还是返回长度(计数)等于 0 的数组(列表等)更好?

事实上它很重要,还是只是开发者的喜好问题?

【问题讨论】:

标签: c# collections methods


【解决方案1】:

这是 Josh Bloch 的一篇文章,对此进行了解释。它是在 Java 的上下文中编写的,但它应该同样适用于 C#。 Return zero-length arrays, not nulls

【讨论】:

    【解决方案2】:

    虽然我会说这主要取决于开发人员的偏好,但返回一个空集合可能是更好的方法。

    假设您有一个包含集合成员的对象。

    public class Customer {
        private IList<Order> _orders;
    
        public Customer() {
            _orders = new List<Order>();
        }
    
        public IList<Order> Orders {
            get {
                return _orders;
            } 
        }
    }
    

    人们通常更愿意将此成员设置为只读属性,以便其客户的订单不会在没有任何明显原因的情况下丢失。因此,返回null 不是一种选择。与空引用相比,使用空集合可能会更好。因此,在类构造函数中实例化集合是一​​种更好的方法。

    最重要的是,例如,在使用 DataBinding 时,返回 null 集合引用时可能会出现奇怪的行为,因为它最好与空集合一起使用。

    另一个例子,当遍历一个集合时,例如:

    foreach (Order o in c.Orders) {
        // Do something here...
    }
    

    当集合为空时,这个foreach 循环将不会被执行,您不必先检查它是否为空引用。它简化了代码并将其复杂性降至最低。

    这取决于您正在工作的场景。

    【讨论】:

    • 投反对票时,请留下评论,解释您的不同意见等,以便我们都可以从中吸取教训。
    【解决方案3】:

    如果出现问题,则不应返回任何内容,而应抛出异常。

    您需要就 NULL 和 {} 的含义为项目达成一致的方法并坚持下去。 如果您是每个人都需要使用 NULL,则无论您是否要使用知道检查。

    我喜欢想到 NULL - 没有尝试或查看是否有任何东西,可能有一些但谁知道。

    空集合 - 试图填充,就系统而言,没有任何项目,这是一个非常有力的声明。

    例如Wallet.Notes 集合。

    • NULL - 我还没有打开我的钱包,所以我不知道里面是否有任何笔记。
    • List={} - 我查过了,我肯定没有任何笔记,因为我把所有的钱都花在了啤酒上。

    【讨论】:

      【解决方案4】:

      如果您返回空集合而不是 null,您的迭代代码会容易得多。

      但是,区分空集合和无数据集合可能很重要,因此这取决于实际类型的语义。

      【讨论】:

      • 投反对票时,请发表评论。谢谢。
      【解决方案5】:

      确实是开发者的喜好。

      返回一个空列表

      通常我会返回一个空列表,以便方法返回对象的接收者不需要检查 null 并避免任何可能的NullReferenceException

      因此,任何期望列表的人都可以遍历列表,即使列表为空(这将是一个非常快速的 for-each 循环)。

      返回空值

      如果您处于内存不足是一个大问题的环境中,您可以优化以返回 null 值。然而,这意味着使用该方法的每个人总是需要检查 null,并且不能解决可能的内存泄漏问题。

      【讨论】:

        【解决方案6】:

        嗯,nullempty有两种不同的含义。一个空集合实际上意味着“这里什么都没有”,并且可能是有效的。您如何知道基于空集合是否出现问题?

        虽然调用方法更安全,但这并不比返回 null 更好。良好的做法表明您应该在对对象进行操作之前检查 null。反正很便宜。

        如果真的出了问题,为什么不能抛出异常?

        【讨论】:

          【解决方案7】:

          如果出现“错误”,您应该抛出异常。如果没有要返回的数据,则返回一个空集合。开发人员通常不应该对 NullReferenceException 感到惊讶,因为他们要求提供项目列表,但碰巧没有可返回。

          【讨论】:

            【解决方案8】:

            我可以看到这两种方式。最终,一个数组或集合具有更大的占用空间,但在某种意义上“更安全”,如果在未来的 foreach/迭代中使用结果,结果将跳过代码块并且不会以空对象异常结束。

            【讨论】:

              【解决方案9】:

              最好返回一个空集合。这样当有人像这样调用函数时:

              foreach(var i in items)
              {
              
              }
              

              它不会对它们抛出空引用异常。

              从技术上讲,您可以争论空与null 的意思,但实际上很多人(有时包括我自己)忘记了防御,并且在使用它之前不检查对象是否为空。它正在考虑其他人认为会发生的事情,这意味着更少的错误和更少的愤怒用户。

              【讨论】:

              • 我同意第一句话但不同意第二句话(即原因)。空集合表示集合中不存在数据,而 null 表示集合本身不存在。有时这种区别很重要。
              • 我同意它们可能意味着不同的东西,我同意理论上 null 应该在适当的时候返回,但真正的问题是人们在期待收集时不会检查 null。你可以争辩说这是他们的问题,他们应该做得更好,但实际上一个坏掉的应用就是坏掉的应用。
              猜你喜欢
              • 1970-01-01
              • 2010-12-30
              • 2018-01-02
              • 1970-01-01
              • 2020-05-15
              • 1970-01-01
              • 2012-11-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多