当我有一个返回对象集合的方法,如果对象数量为零,我应该返回什么?null
还是只是空的List<T>
?哪种做法更好?
public List<string> GetPupilsByClass(string className)
{
....
}
当我有一个返回对象集合的方法,如果对象数量为零,我应该返回什么?null
还是只是空的List<T>
?哪种做法更好?
public List<string> GetPupilsByClass(string className)
{
....
}
我肯定会返回一个空列表,这样就可以在调用对象时无需进行null检查。返回空列表和不返回任何内容是有区别的,因此调用代码可能并不希望接收到空引用(除非发生异常或其他情况)。
要看具体情况而定,但通常情况下,返回一个空列表会更加典型,否则调用者必须知道进行null检查。我会返回null的主要情况是,如果这是一个以下风格的方法:
bool Try*(args, out result)
调用者期望(在收到false
时)甚至不查看result
的值。
如果你要返回数组,有一个好办法——可以在某个静态字段中存储一个零长度的类型化数组,并返回它。但是,最终分配一个空列表也不会占用太多资源,所以只需返回它即可。
foreach(var element in obj.Method()) ...
var results = from x in GetPupilsByClass(className) where x.StartsWith("A");
yield
的惰性特性),那么我建议将你的方法签名更改为以下形式:public bool TryGetPupilsByClass(string className, out ICollection<string> pupils)
这种技术有三个优点。
ICollection<string>
是强类型的,而不会暴露你正在使用的存储机制。应该谨慎使用返回具体类的方法。替代方案包括IList<string>
、ReadOnlyCollection<string>
和IEnumerable<string>
等,但你选择的方法肯定会让用户对结果的可操作性有更清晰的认识。这个方法是IFC方法吗?也就是说,它被外部对象使用而不受您控制? 如果答案是肯定的,那么我会返回一个空集合,因为调用者不希望出现异常。
如果这个方法是内部方法,只有您自己使用,那么我会返回null,以节省为空集合分配的浪费内存和一旦停止使用后GC性能的影响。
始终返回空列表。这样你就可以避免最常见的异常 - NullReferenceException
。
我通常遵循R.Martin的Clean Code指南。建议返回一个空列表:
public List GetPupilsByClass(string className) { .... }
我这样做有以下原因:
这实际上取决于您的代码在哪个上下文中使用。对于大多数情况,我会返回一个零对象列表,并且我认为在这里也最好这样做 - 这更符合您正常结果的一致性。