重写以下代码是否安全:
bool b = foo.bar.HasValue ? foo.bar.Value : false;至
bool b = foo.bar.Value ?? false;其中,bar是可以为空的类型bool?
发布于 2011-06-24 19:22:07
最简单的修复方法是
bool b = foo.bar.GetValueOrDefault();这实际上也比.Value更便宜,因为它省略了has-value检查。它将默认为default(T),在这里它实际上是false (它只返回底层T字段的值,而不进行任何检查)。
如果您需要不同于default(T)的默认值,则:
var value = yourNullable.GetValueOrDefault(yourPreferredValue);发布于 2011-06-24 19:20:51
你想要的是:
bool b = foo.bar ?? false;这(令人惊讶地)是安全的,并且是null-coalescing运算符的预期用途。
The ??运算符称为空合并运算符,用于定义、可为空值类型、以及引用类型的默认值。如果左操作数不为空,则返回左操作数;否则返回右操作数。
来源:http://msdn.microsoft.com/en-us/library/ms173224.aspx
在Nullable<T>的情况下,它在功能上等同于Nullable.GetValueOrDefault(T defaultValue)。
代码:
bool b = foo.bar.Value ?? false;将导致编译器错误,因为您不能将运算符应用于值类型,并且Nullable<T>.Value总是返回值类型(或者在没有值时抛出异常)。
发布于 2011-06-24 19:19:01
不-这不安全。
这行代码:
bool b = foo.bar.Value ?? false;如果foo.bar没有值,将抛出InvalidOperationException。
相反,请使用
var b = foo.bar ?? false;更新-我刚从其他答案中了解到.GetValueOrDefault(); -这看起来是一个很好的建议!
更新2 -@ProgrammingHero的答案也是正确的(增加了+1!)-这行:
bool b = foo.bar.Value ?? false实际上不会编译-因为Error 50 Operator '??' cannot be applied to operands of type 'bool' and 'bool'
https://stackoverflow.com/questions/6466967
复制相似问题