我应该返回什么结果?

本文关键字:结果 什么 返回 我应该 | 更新日期: 2023-09-27 18:14:35

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

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

return new List<String>();

return null;

的例子:

var resultColl=FindNames(...);

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

谢谢。

我应该返回什么结果?

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

不要从集合属性或方法返回空值返回集合。返回空集合或空数组相反。

返回空列表对于函数的用户来说更方便:

foreach (string name in FindNames(...))
{
   Display(name);
}

返回null强制调用者编写额外的代码:

  • 为null的测试,和
  • 一个额外的局部变量(为了避免调用你的函数两次)

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

所以返回一个空列表比较好。

我会返回Enumerable.Empty<string>(),或者如果你的方法应该返回一个列表,做return new List<string>()。如果你有很多需要返回空列表的情况,你可以创建一个每次都返回的静态列表,这将阻止每次都必须创建新的空列表,正如@YuvalItzchakov所指出的。

空集合比null更好,因为在我看来,它会导致更干净的代码。

调用代码很可能想要迭代列表,或者对list做一些事情。通过返回空List,调用代码应该可以正常工作。如果你返回null,那么调用代码必须确保它们首先有一个列表。

这可能只是一个偏好问题,但是返回一个空列表会得到我的投票…你在返回合同规定的东西

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

这取决于代码的语义。

如果没有结果是可接受的结果,那么你应该返回一个空集合。

如果没有结果是错误条件,则返回null

我建议你在没有任何回报的情况下保持一致。这样你就知道,无论你打什么电话,都不会得到同样的回应。例如知道您将始终返回空集合或空字符串或0等。

你如何处理你拥有的其他库项?

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

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