我写简单的库,返回名称列表。
但是,如果我找不到任何东西,我应该回报什么?
return new List<String>();
或
return null;
示例:
var resultColl=FindNames(...);
此代码可以从其他组件使用,我不想破坏它。 如果我返回null-我认为这是检查它的正确方法。但是,我可能应该返回空列表吗?
谢谢。
答案 0 :(得分:15)
您应该始终返回空列表。请参阅Guidelines for Collections。
不要从集合属性或方法返回空值 返回集合。返回一个空集合或一个空数组 代替。
答案 1 :(得分:5)
我将返回Enumerable.Empty<string>()
,或者如果您的方法应该返回一个List,请执行return new List<string>()
。如果你有很多需要返回空列表的情况,你可以创建一个静态列表,每次都返回,这将阻止每次都必须创建新的空列表,如{{1}所指出的那样。 }。
空集合优于@YuvalItzchakov
,因为在我看来,它会带来更清晰的代码。
答案 2 :(得分:5)
返回空列表对于您的函数用户来说更方便:
foreach (string name in FindNames(...))
{
Display(name);
}
返回null会强制您的调用者编写额外的代码:
一个额外的局部变量(以避免必须两次调用你的函数)
List<string> names = FindNames(...);
if (names != null)
{
foreach (string name in names)
{
Display(name);
}
}
所以返回一个空列表更好。
答案 3 :(得分:3)
调用代码可能希望迭代列表,或者使用List执行某些操作。通过传回一个空List,调用代码应该可以正常工作。如果你返回null,那么调用代码必须确保它们首先有一个列表。
这可能仅仅是一个偏好问题,但是返回一个空列表会得到我的投票......你将返回合同说它会返回的东西。
答案 4 :(得分:2)
从设计角度来看,返回空集合更好,因为客户端代码不需要执行空检查。请参阅Null Object pattern。
答案 5 :(得分:1)
这取决于代码的语义。
如果没有结果是可接受的结果,那么你应该返回一个空集合。
如果没有结果是错误条件,则返回null。
答案 6 :(得分:1)
我建议你在没有任何回报的时候保持一致。通过这种方式,您始终可以知道您所要求的任何内容都可以获得相同类型的响应。比如知道你总是会返回一个空集或一个空字符串或0等。
您对自己拥有的其他图书馆资料有何看法?
答案 7 :(得分:0)
更详细的答案是Tuple<bool, List<string>>
。这是一个明确的解决方案,可以对其进行修改以包含有关搜索的其他详细信息:
var thereAreResults = foundList.Count > 0;
return new Tuple<bool, List<String>>(thereAreResults, foundList);