我有一个SQL Reader对象,我会迭代它,而且通常情况下,你永远不会知道你会得到什么。无论读者返回什么值,都需要将其转换为double,但如果它返回null,我需要使用默认值优雅地处理它,在本例中为0。我开始使用与此类似的代码...
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结果,这让我相信都能像我期望的那样工作但我宁愿一定不会。
所以,关于我的问题。有人可以解释一下我使用这两种功能可能会遇到的功能差异吗?如果可能,有人可以提供/解释第二个例子的更好实现吗?我发现null-coalesce运算符非常性感,但我真的不知道我是否以最佳方式实现它。感谢。
答案 0 :(得分:5)
如果您已经知道了在您的情况下看起来的列位置(序数),那么您最好使用正确的数据类型检索并在此之前检查null,这样
double x = reader.IsDBNull(1) ? 0 : reader.GetDouble(1);
答案 1 :(得分:2)
您的两个示例在功能上是等效的:null
将解析为0
,double
将解析为其值。对于大多数实际目的,它们都很快就会运行。 (如果你真的需要知道,后者应该运行得更快)我更喜欢后者(使用空合并)以提高可读性。
但请注意,如果您可能遇到其他值,例如int
或string
,您可能需要考虑使用Convert.ToDouble
,它会尝试转换您提供的任何值它。它还会将null
默认为0
。
答案 2 :(得分:1)
as
关键字会产生额外费用,因为它已将对象转换为所需类型。
使用var x = !reader.IsDBNull(1) ? r.GetDouble(1) : 0;