假设我有一个返回数组或列表或其他集合的方法。如果内部出现问题或者根本没有数据要返回,那么更好的方法是返回null或返回长度(计数)等于0的数组(列表等)?
事实上它很重要,还是只是开发人员的偏好?
答案 0 :(得分:9)
最好返回一个空集合。这样当有人像这样调用函数时:
foreach(var i in items)
{
}
它不会对它们抛出空引用异常。
从技术上讲,你可以争论空对null
的意思,但实际上很多人(有时包括我自己)忘记防守,在使用之前不检查对象是否为空。它正在发挥其他人认为会发生的事情,这意味着更少的错误和更少愤怒的用户。
答案 1 :(得分:4)
如果返回空集合而不是null,则迭代代码会更容易。
但是,区分空集合和不集合数据可能很重要,因此它取决于实际类型的语义。
答案 2 :(得分:1)
如果出现“出错”,你应该抛出异常。如果没有要返回的数据,则返回空集合。一般情况下,开发人员在询问项目列表时不应对NullReferenceException
感到惊讶,而且恰好没有人回复。
答案 3 :(得分:0)
我可以看到这种方式。最终是一个具有更大占用空间的数组或集合,但在某种意义上是“更安全”,如果结果将在未来的foreach /迭代中使用,结果将跳过代码块而不会以空对象异常结束。 / p>
答案 4 :(得分:0)
嗯, null 和 empty 有两个不同的含义。空集合实际上意味着“什么都不在这里”,并且可能是有效的。你怎么知道基于空集合出了什么问题呢?
虽然调用方法更安全,但这并不比返回null更好。良好实践规定,在对对象执行操作之前,应检查null。反正它很便宜。
如果出现了什么问题,为什么不能抛出异常?
答案 5 :(得分:0)
真的是开发者的偏好。
通常我会返回一个空列表,以便方法的返回对象的接收者不需要检查null并避免任何可能的NullReferenceException
。
所以任何期望列表的人都可以遍历列表,即使列表为空(这将是一个非常快速的for-each循环)。
如果您处于内存不足的大环境中,则可以优化以返回空值。但是,这意味着使用该方法的所有人总是需要检查null ,并且不能解决可能的内存泄漏问题。
答案 6 :(得分:0)
如果出现问题,那么你不应该返回任何东西,而是抛出异常。
您需要就项目的NULL和{}的含义达成一致的方法并坚持下去。要么是否要使用NULL,如果你是每个人都需要知道检查。
我喜欢考虑NULL - 没有试过或者看看是否有什么,可能有一些但是谁知道。
空集合 - 试图填充,就系统而言,没有任何项目,这是一个非常强烈的声明。
e.g。 Wallet.Notes集合。
答案 7 :(得分:0)
这是Josh Bloch的一篇文章,解释了同样的问题。它是用Java编写的,但它应该同样适用于C#。 Return zero-length arrays, not nulls
答案 8 :(得分:-1)
虽然我认为这主要取决于开发人员的偏好,但返回空集可能是一种更好的方法。
假设您有一个包含集合成员的对象。
public class Customer {
private IList<Order> _orders;
public Customer() {
_orders = new List<Order>();
}
public IList<Order> Orders {
get {
return _orders;
}
}
}
人们通常希望将此成员作为只读属性,以便客户的订单不会在没有任何明显原因的情况下丢失。因此,返回null
不是一种选择。使用空集合而不是空引用可能会更好。因此,在类构造函数中实例化集合是一种更好的方法。
最重要的是,例如,在使用DataBinding时,返回null集合引用时可能会出现奇怪的行为,因为它最好使用空集合。
另一个例子,当迭代一个集合时,如:
foreach (Order o in c.Orders) {
// Do something here...
}
当集合为空时,不会执行此foreach
循环,而不必先检查它是否为空引用。它简化了代码并最大限度地降低了复杂性。
这取决于您所处的情景。