【问题标题】:What result i should return? [duplicate]我应该返回什么结果? [复制]
【发布时间】:2015-12-23 06:34:35
【问题描述】:

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

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

return new List<String>();

return null;

示例:

var resultColl=FindNames(...);

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

谢谢。

【问题讨论】:

  • empty List 会很好,我认为 instad of null
  • 请注意,您根本不应该返回List&lt;T&gt;。返回空的IList&lt;T&gt;,或者,如果可能的话,空的IEnumerable&lt;T&gt;

标签: c# .net


【解决方案1】:

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

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

【讨论】:

  • 你可能提到了Enumerable.Empty&lt;string&gt;().ToList();
  • @YuvalItzchakov 为什么?如果你走那条路,就做new List&lt;string&gt;();
  • @Rob 除非 OP 收到 IEnumerable&lt;string&gt;,否则不会编译。当他使用List&lt;string&gt;时,我认为这就是他正在使用的。
  • @YuvalItzchakov:我不知道 OP 的期望是什么,但如果 List&lt;string&gt; 是预期的,那么它需要进行转换,但它又会使 Enumerable.Empty 的使用变得多余。
  • @npinti 在这种情况下,我认为创建static List&lt;string&gt; 会更好,性能明智。
【解决方案2】:

更详细的答案是Tuple&lt;bool, List&lt;string&gt;&gt;。这是一个明确的解决方案,可以对其进行修改以包含有关您的搜索的其他详细信息:

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

【讨论】:

  • 反对者没有理由?
  • 这是一个可怕的设计。它也无法编译。
  • 我没有投反对票,但这似乎毫无意义,因为调用者可以在返回的列表上调用Count,或者更有可能在foreach 中迭代它。你也可以return Tuple.Create(thereAreReullts, foundList); 代替。
  • 强调的是一种包含更多信息的方法,而不仅仅是一个空的 List()。不过没关系。
【解决方案3】:

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

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

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

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

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

所以返回一个空列表会更好。

【讨论】:

    【解决方案4】:

    我建议您在没有任何回报的情况下始终如一。这样一来,您总是知道您正在调用的任何内容,以期望得到相同类型的响应。比如知道你总是会返回一个空集或者一个空字符串或者0等等。

    对于您拥有的其他图书馆物品,您会怎么做?

    【讨论】:

      【解决方案5】:

      这取决于代码的语义。

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

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

      【讨论】:

      • 如果没有结果是错误情况,考虑抛出异常!
      • @MatthewWatson 你是对的,异常会比返回 null 更好
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        您应该始终返回空列表。请参阅Guidelines for Collections

        不要从集合属性或方法返回空值 返回收藏。返回一个空集合或一个空数组 而是。

        【讨论】:

        • 绝对,尽量避免使用null。它只是库应该提供一些默认的空实现。
        【解决方案8】:

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

        【讨论】: