关于c#:我应该返回什么结果?

What result i should return?

本问题已经有最佳答案,请猛点这里访问。

我写了一个简单的图书馆,上面有名字的清单。

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

1
return new List<String>();

1
return null;

例子:

1
var resultColl=FindNames(...);

此代码可以从其他组件中使用,我不想损坏它。如果我返回空值-我认为这是检查它的正确方法。但是,我可以退回空名单吗?

谢谢您。


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

DO NOT return null values from collection properties or from methods
returning collections. Return an empty collection or an empty array
instead.


返回空列表对您的函数的用户更方便:

1
2
3
4
foreach (string name in FindNames(...))
{
   Display(name);
}

返回空值将强制调用方编写额外代码:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    List<string> names = FindNames(...);

    if (names != null)
    {
       foreach (string name in names)
       {
          Display(name);
       }
    }

所以返回空列表更好。


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

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


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

这可能只是一个偏好问题,但是返回一个空的列表会得到我的投票…你要把合同上说的东西还给我。


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


我建议你在没有任何回报的时候,要始终如一。通过这种方式,您总是知道您所调用的任何内容都期望得到相同类型的响应。比如知道你总是会返回一个空的集合或者一个空的字符串或者0等等。

你对其他图书馆的藏品做了什么?


这取决于代码的语义。

如果没有结果是可接受的结果,则应返回空集合。

如果没有结果是错误条件,则返回空值。


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

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