我应该返回什么结果?(这是一个关于IT技术的提问标题)

9

我写了一个简单的库,它返回一个名称列表。

但是,如果我找不到任何东西,我应该返回什么?

return new List<String>();

或者
return null;

示例:

var resultColl=FindNames(...);

这段代码可以从其他组件中使用,我不想破坏它。如果我返回null- 我认为这是正确的检查方式。但是,也许我应该返回空列表?

谢谢。


1
空列表应该比null更好。 - Ehsan Sajjad
请注意,您不应该返回 List<T>。而应该返回空的 IList<T> 或者如果可能的话,空的 IEnumerable<T> - Dennis
8个回答

15

你应该始终返回空列表。参见集合指南

不要从集合属性或返回集合的方法中返回null值。而是返回空集合或空数组。


1
尽可能避免使用null。库应该提供一些默认的空实现。 - zinking

5
我会返回Enumerable.Empty<string>(),或者如果您的方法需要返回一个List,请使用return new List<string>()。如果您有很多需要返回空List的情况,您可以创建一个静态List,每次都返回它,这样就不用每次创建新的空List了,正如 @YuvalItzchakov所指出的。
相比于null,一个空集合更好,因为在我看来这将导致更清晰的代码。

1
你可能想要使用 Enumerable.Empty<string>().ToList(); - Yuval Itzchakov
@YuvalItzchakov 为什么?如果你选择这条路,只需执行 new List<string>(); - Rob
1
@Rob 除非 OP 收到 IEnumerable<string>,否则这个代码不会编译。因为他使用了 List<string>,我假设那是他正在使用的。 - Yuval Itzchakov
@YuvalItzchakov:我不知道OP期望什么,但如果期望List<string>,那么它需要被转换,但这样一来使用Enumerable.Empty就变得多余了。 - npinti
@YuvalItzchakov:是的,它会这样做。 - npinti
显示剩余2条评论

5
返回空列表对于使用您的函数的用户更加方便:
foreach (string name in FindNames(...))
{
   Display(name);
}

返回 null 会迫使调用者编写额外的代码:

  • a test for null, and
  • an extra local variable (to avoid having to call your function twice)

    List<string> names = FindNames(...);
    
    if (names != null)
    {
       foreach (string name in names)
       {
          Display(name);
       }
    }
    

因此,返回一个空列表更好。


3

很可能调用代码需要迭代列表或对列表进行某些操作。通过返回一个空列表,调用代码应该能够正常工作。如果你返回null,则调用代码将必须确保先有一个列表。

这可能只是个人偏好,但返回一个空列表得到了我的认同...你返回了合同规定应该返回的东西。


2

从设计角度来看,返回空集合更好,因为客户端代码不需要执行空检查。参见空对象模式


1
这取决于您代码的语义。
如果没有结果是可以接受的结果,则应返回一个空集合。
如果没有结果是错误条件,则返回 null。

1
如果没有结果是错误条件,请考虑抛出异常! - Matthew Watson
@MatthewWatson 你说得对,抛出异常比返回 null 更好。 - Domysee

1
我建议您在没有返回值时保持一致性。这样,您总是知道无论您调用什么内容,都可以期望相同类型的响应。例如,知道您将始终返回空集或空字符串或0等。

对于您拥有的其他库项,您会怎么做?


0
一个更详细的答案是 Tuple<bool, List<string>>。这是一个清晰的解决方案,可以修改以包含有关您搜索的其他详细信息:

var thereAreResults = foundList.Count > 0;
return new Tuple<bool, List<String>>(thereAreResults, foundList);

下投票者没有任何理由吗? - tomab
1
这是一个非常糟糕的设计。而且它也无法编译。 - Rob
1
我没有给它点踩,但这似乎是无意义的,因为调用者可以在返回的列表上调用 Count 或更有可能在 foreach 中迭代它。此外,你也可以直接 return Tuple.Create(thereAreReullts, foundList); - juharr
强调是一种包含更多信息而不仅仅是空列表(List())的方法。但无论如何。 - tomab

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