我应该返回'null'还是空数组?

时间:2008-12-01 21:10:33

标签: .net coding-style

假设您有一个应该创建并返回某种数组的方法。如果数组没有填充,该怎么办?你是返回一个空数组还是null / nothing?

12 个答案:

答案 0 :(得分:28)

在.NET中,最好返回一个空数组而不是null,因为它可以保存调用者必须写入空检查和/或冒NullReferenceException的风险;你会发现这是基类库中的常见模式。唯一不允许这样做的情况是,空数组和null具有不同的语义含义。

official array usage guidelines州:

  

一般规则是null,为空   字符串(“”)和空(0项)数组   应该以同样的方式对待。返回   一个空数组而不是null   参考

也就是说,如果您使用的是.NET 2.0或更高版本,最好返回IEnumerable<T>或其中一个可扩展的衍生产品,例如Collection<T>ReadOnlyCollection<T>,{{ 1}}或ICollection<T>(在这种情况下,我仍然倾向于返回空的而不是null)。 More info as to why these should be preferred can be found at Eric Lippert's blog

答案 1 :(得分:2)

我返回一个空数组 - 看起来是正确的事情。

答案 2 :(得分:2)

你对这个问题的回答可能很大程度上取决于你使用的语言。在像C这样的语言中,不可能返回一个空数组,因为数组只是指向数组开始的某个内存地址的指针。在这种情况下,唯一的选择是返回空指针。

答案 3 :(得分:2)

如果你仔细阅读了你的问题,你会发现你自己已经自己已经回答过了:你写了“应该创建并返回某种数组的方法”而不是“应该创建的方法和也许返回某种或不“的数组。

真的,这取决于规格。但是按照你的措辞,这种方法无法返回null。无论如何,这是我更喜欢的风格,它只是使边缘案件处理变得更加容易。

答案 4 :(得分:1)

这实际上取决于调用者想要对结果做些什么。

通常我返回空数组(或Java中的Collection)。那是因为我通常会经历一个循环,并可选择将它们添加到Collection中,然后返回它。最后检查Collection.size() == 0是否是额外步骤。然后调用者需要添加额外的检查以查看结果是否为0,如果是,则避免迭代Collection。

我很感激返回null可能更干净,但除非我有理由,否则更容易。

答案 5 :(得分:1)

如果这是真正独立于语言的,我会返回一个空的数组对象,大多数容器应该有一个函数,比如IsEmpty(),所以函数的调用者会在它们对它做任何事之前检查数组是否为IsEmpty。

如果这是在C ++中,我可以看到它变为null,或者如果你传入了对数组的引用,那么你返回数组大小......

答案 6 :(得分:1)

我返回调用者期望的任何内容。 如果该函数应该返回“X为真的所有对象”,并且X对于任何对象都不为真,则返回一个空数组。

如果函数甚至无法执行此搜索“X为真的对象”,则它失败,并且必须以某种方式向呼叫者发出信号。这可以通过返回null来完成。

答案 7 :(得分:0)

除非由于某种原因,你的代码中的结果意义不同,因为空数组与空白数组相比,我将返回一个空白数组。这也可能是语言特定的事情。在某些语言中,您可能只有一个选项。

答案 8 :(得分:0)

我想这取决于语言处理它的方式。

在C中,我传递指针并始终包含一个指针,该指针是数组的大小。然后调用函数必须提供两个东西:数组和数组的大小。如果函数没有填充数组,它只返回相同的指针,并且不对数组大小做任何事情。通常我只是重新实现一个矢量类型结构并使用它。

在perl中,数组大小是隐式处理的,所以我只返回一个空数组,或者如果有错误,我修改错误代码变量并返回一个undef。

在java中,我使用ArrayLists,并使用size属性。

答案 9 :(得分:0)

如果您有幸使用C#,请声明一个静态只读属性,如下所示:

public static class ArrayUtil<TElement> 
{
    public static readonly Empty = new TElement[0];
}

(这是在BCL吗?为什么不呢?)

您现在可以返回ArrayUtil<int>.Empty或其他任何内容。这几乎消除了使用空数组而不是null的运行时成本,并使调用者比处理空值更简单。

答案 10 :(得分:0)

答案取决于调用者和函数之间的契约。 如果您打算将数组标记为无效,那么null是一种比返回零大小数组更好的方法,因为在某些情况下,零大小的数组可能是有效的结果。

答案 11 :(得分:0)

嗯,这实际上取决于你想要给回归的语义。

通常,我使用几乎所有函数/方法的前置条件和后置条件。这意味着如果我的方法应该返回一个包含特定处理数据的数组,如果此处理失败,则该对象应为null并且post条件将失败。

但是在你的情况下,我认为你不使用DbC,所以,如果我只提到你的问题:

  

如果未填充数组,该怎么办?

然后我会返回null,因为我认为你的措辞中有些错误。