【发布时间】:2011-05-21 18:46:31
【问题描述】:
假设我有一个返回数组或列表或其他集合的方法。如果内部出现问题或者根本没有数据要返回,那么返回 null 还是返回长度(计数)等于 0 的数组(列表等)更好?
事实上它很重要,还是只是开发者的喜好问题?
【问题讨论】:
-
绝对是重复的。对此感到抱歉。问题可能已结束。
标签: c# collections methods
假设我有一个返回数组或列表或其他集合的方法。如果内部出现问题或者根本没有数据要返回,那么返回 null 还是返回长度(计数)等于 0 的数组(列表等)更好?
事实上它很重要,还是只是开发者的喜好问题?
【问题讨论】:
标签: c# collections methods
这是 Josh Bloch 的一篇文章,对此进行了解释。它是在 Java 的上下文中编写的,但它应该同样适用于 C#。 Return zero-length arrays, not nulls
【讨论】:
虽然我会说这主要取决于开发人员的偏好,但返回一个空集合可能是更好的方法。
假设您有一个包含集合成员的对象。
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 循环将不会被执行,您不必先检查它是否为空引用。它简化了代码并将其复杂性降至最低。
这取决于您正在工作的场景。
【讨论】:
如果出现问题,则不应返回任何内容,而应抛出异常。
您需要就 NULL 和 {} 的含义为项目达成一致的方法并坚持下去。 如果您是每个人都需要使用 NULL,则无论您是否要使用知道检查。
我喜欢想到 NULL - 没有尝试或查看是否有任何东西,可能有一些但谁知道。
空集合 - 试图填充,就系统而言,没有任何项目,这是一个非常有力的声明。
例如Wallet.Notes 集合。
【讨论】:
如果您返回空集合而不是 null,您的迭代代码会容易得多。
但是,区分空集合和无数据集合可能很重要,因此这取决于实际类型的语义。
【讨论】:
确实是开发者的喜好。
通常我会返回一个空列表,以便方法返回对象的接收者不需要检查 null 并避免任何可能的NullReferenceException。
因此,任何期望列表的人都可以遍历列表,即使列表为空(这将是一个非常快速的 for-each 循环)。
如果您处于内存不足是一个大问题的环境中,您可以优化以返回 null 值。然而,这意味着使用该方法的每个人总是需要检查 null,并且不能解决可能的内存泄漏问题。
【讨论】:
嗯,null和empty有两种不同的含义。一个空集合实际上意味着“这里什么都没有”,并且可能是有效的。您如何知道基于空集合是否出现问题?
虽然调用方法更安全,但这并不比返回 null 更好。良好的做法表明您应该在对对象进行操作之前检查 null。反正很便宜。
如果真的出了问题,为什么不能抛出异常?
【讨论】:
如果出现“错误”,您应该抛出异常。如果没有要返回的数据,则返回一个空集合。开发人员通常不应该对 NullReferenceException 感到惊讶,因为他们要求提供项目列表,但碰巧没有可返回。
【讨论】:
我可以看到这两种方式。最终,一个数组或集合具有更大的占用空间,但在某种意义上“更安全”,如果在未来的 foreach/迭代中使用结果,结果将跳过代码块并且不会以空对象异常结束。
【讨论】:
最好返回一个空集合。这样当有人像这样调用函数时:
foreach(var i in items)
{
}
它不会对它们抛出空引用异常。
从技术上讲,您可以争论空与null 的意思,但实际上很多人(有时包括我自己)忘记了防御,并且在使用它之前不检查对象是否为空。它正在考虑其他人认为会发生的事情,这意味着更少的错误和更少的愤怒用户。
【讨论】: