1

我有一个 SQL Reader 对象,我对其进行迭代,而且通常情况下,你永远不知道你会得到什么。读者返回的任何值都需要转换为双精度值,但如果它返回 null,我需要用默认值优雅地处理它,在这种情况下为零。我开始使用与此类似的代码...

double x;
if (reader[1] is double)
    x = (double)reader[1];
else
    x = 0;

...这似乎可以解决问题,但我并不满意。我认为设计 C# 的神秘团队会为此配备一个运算符,你知道吗,. 所以,然后我最终得到了一个稍微不同的实现......

var x = reader[1] as Double? ?? 0;

我无法告诉您上面的两个示例是否等效,因为像所有新手一样,我采用了我认为可以解决问题并将其用于重要事情的代码——部分笑话。我所知道的是,我还没有让任何一种实现在访问数据库并获得空结果时抛出异常,这让我相信两者都能按我的预期工作,但我宁愿确定。

所以,关于我的问题。有人可以解释一下我在使用这两种方法时可能遇到的潜在功能差异吗?如果可能,有人可以提供/解释第二个示例的更好实现吗?我发现 null-coalesce 运算符非常性感,但我真的不知道我是否以最好的方式实现它。谢谢。

4

3 回答 3

5

如果您已经知道在您的情况下看起来的列位置(序数),那么最好使用正确的数据类型检索器并像这样事先检查 null

double x = reader.IsDBNull(1) ? 0 : reader.GetDouble(1);
于 2013-07-15T16:44:28.757 回答
2

您的两个示例在功能上是等效的:null将解析为0double将解析为其值。对于大多数实际目的,它们都可以立即运行。(如果你真的需要知道,后者应该运行得稍微快一些)我更喜欢后者(使用空合并)以提高可读性。

但是,请注意,如果您可能遇到其他值,例如intor string,您可能需要考虑使用Convert.ToDouble,它将尝试转换您给它的任何值。它还将默认 anull0.

于 2013-07-15T16:46:22.577 回答
1

as关键字有额外的成本,因为它已经将对象转换为想要的类型。

利用var x = !reader.IsDBNull(1) ? r.GetDouble(1) : 0;

于 2013-07-15T16:44:58.170 回答