我写了一个简单的库,它返回一个名称列表。
但是,如果我找不到任何东西,我应该返回什么?
return new List<String>();
或者
return null;
示例:
var resultColl=FindNames(...);
这段代码可以从其他组件中使用,我不想破坏它。如果我返回null- 我认为这是正确的检查方式。但是,也许我应该返回空列表?
谢谢。
你应该始终返回空列表。参见集合指南。
不要从集合属性或返回集合的方法中返回null值。而是返回空集合或空数组。
null
。库应该提供一些默认的空实现。 - zinkingEnumerable.Empty<string>()
,或者如果您的方法需要返回一个List,请使用return new List<string>()
。如果您有很多需要返回空List的情况,您可以创建一个静态List,每次都返回它,这样就不用每次创建新的空List了,正如 @YuvalItzchakov
所指出的。null
,一个空集合更好,因为在我看来这将导致更清晰的代码。Enumerable.Empty<string>().ToList();
。 - Yuval Itzchakovnew List<string>();
。 - RobIEnumerable<string>
,否则这个代码不会编译。因为他使用了 List<string>
,我假设那是他正在使用的。 - Yuval ItzchakovList<string>
,那么它需要被转换,但这样一来使用Enumerable.Empty就变得多余了。 - npintiforeach (string name in FindNames(...))
{
Display(name);
}
返回 null 会迫使调用者编写额外的代码:
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);
}
}
因此,返回一个空列表更好。
很可能调用代码需要迭代列表或对列表进行某些操作。通过返回一个空列表,调用代码应该能够正常工作。如果你返回null,则调用代码将必须确保先有一个列表。
这可能只是个人偏好,但返回一个空列表得到了我的认同...你返回了合同规定应该返回的东西。
对于您拥有的其他库项,您会怎么做?
Tuple<bool, List<string>>
。这是一个清晰的解决方案,可以修改以包含有关您搜索的其他详细信息:
var thereAreResults = foundList.Count > 0;
return new Tuple<bool, List<String>>(thereAreResults, foundList);
Count
或更有可能在 foreach
中迭代它。此外,你也可以直接 return Tuple.Create(thereAreReullts, foundList);
。 - juharr
List<T>
。而应该返回空的IList<T>
或者如果可能的话,空的IEnumerable<T>
。 - Dennis