【发布时间】:2013-07-15 16:37:47
【问题描述】:
我有一个 SQL Reader 对象,我对其进行迭代,通常情况下,您永远不知道自己会得到什么。读取器返回的任何值都需要转换为双精度值,但如果它返回 null,我需要使用默认值优雅地处理它,在这种情况下为零。我开始使用与此类似的代码...
double x;
if (reader[1] is double)
x = (double)reader[1];
else
x = 0;
...这似乎可以解决问题,但我并不满意。我认为设计 C# 的神秘团队会为此配备一个运算符,你知道吗,there is。所以,我最终得到了一个稍微不同的实现......
var x = reader[1] as Double? ?? 0;
我不能告诉你上面的两个例子是否是等价的,因为像所有新手一样,我使用我认为可以解决问题并将其用于重要事情的代码 - 部分笑话。我所知道的是,我还没有让任何一种实现在访问数据库并获得空结果时抛出异常,这让我相信两者都按我的预期工作,但我宁愿确定。
那么,关于我的问题。有人可以解释一下我在使用这两种方法时可能遇到的潜在功能差异吗?如果可能,有人可以提供/解释第二个示例的更好实现吗?我发现 null-coalesce 运算符非常性感,但我真的不知道我是否以最好的方式实现它。谢谢。
【问题讨论】:
-
好吧,你也可以写:
var x = (reader[1] as Double?).GetValueOrDefault();。这样做的好处是x是double而不是double?。但这也隐藏了不兼容的值。如果reader[1]返回string会怎样,因为您重新排序了返回值?而不是得到一个异常(因为垃圾输入),你只是得到0并且永远不知道垃圾输入。相反,执行正常转换:var x = ((double?)reader[1]).GetValueOrDefault()。如果它是可铸造的,它将起作用并为您提供价值或0。如果没有,它会抛出一个异常,你可以修复索引值。 -
另外,如果你的默认值不是
0,你可以使用GetValueOrDefault(defaultValue)重载。
标签: c# null-coalescing-operator