【发布时间】:2016-08-30 15:18:25
【问题描述】:
新的 C# 6.0 空条件运算符是编写更简洁和更少复杂代码的便捷工具。假设一个客户有一组客户,那么如果 customers 为空,则您可以获得空而不是长度(来自 MSDN 的示例):
int? length = customers?.Length;
同样,您可以通过以下方式获得 null 而不是客户:
Customer first = customers?[0];
对于更详细的表达式,如果customers 为空,第一个客户为空,或者第一个客户的Orders 对象为空,则返回空:
int? count = customers?[0]?.Orders?.Count();
但是还有一个有趣的案例,即不存在的客户,空条件运算符似乎没有解决。我们在上面看到一个 null 客户被覆盖,即如果 customers 数组中的条目为空。但这与 不存在 的客户截然不同,例如在 3 元素数组中查找客户 5 或在 0 元素列表中查找客户 n。 (请注意,同样的讨论也适用于字典查找。)
在我看来,空条件运算符只专注于否定 NullReferenceException 的影响; IndexOutOfRangeException 或 KeyNotFoundException 是孤独的,暴露的,蜷缩在角落里,需要自生自灭!我认为,本着空条件运算符的精神,它也应该能够处理这些情况......这导致了我的问题。
我错过了吗?空条件是否提供任何优雅的方式来真正覆盖这个表达式...
customers?[0]?.Orders?.Count();
...当没有第零个元素时?
【问题讨论】:
-
“空条件运算符”,而不是“异常通配符”。就我个人而言,如果它绕过 OutOfIndexExceptions/KeyNotFoundException for nulls,我会考虑不直观的行为。
-
?.运算符只是将代码包装在if (val != null) { ...//Continue }中。IndexOutOfRangeException可以来自任何地方,而且许多课程确实会抛出它。就传统数组而言,索引操作也不一定意味着索引查找,它也用于字典/查找/等。捕获这种异常是没有意义的。
标签: c# arrays null c#-6.0 null-propagation-operator