C# 2.0 使我能够访问可空类型。当我希望数据库中的 DateTime 变量为空时,这似乎非常方便。在使用可空类型时,有什么我应该担心的吗?或者我是否可以过火并使我拥有的每种类型都可以为空?
最佳答案
Mitch 的 DBNull 不为空是一个很好的观点。还要注意这一点,这是合法的 C# 但会(幸运的是)产生警告:
int x = 0;
// Much later
if (x == null)
看起来它应该是非法的,但它是有效的,因为 x 可以隐式转换为可为空的 int。切勿忽略此警告。
您还应该了解表面上看起来与运营商有什么不同之处。例如,通常您会期望:
if (x <= y || x >= y)
总是为真 - 但当 x
和 y
都为 null
时就不是了。但是,x == y
将为真——这与 SQL 不同,实际上也与 VB 不同!提升的运算符行为由语言而非运行时提供,因此您需要了解您使用的每种语言将执行的操作。
最后,确保您了解装箱如何处理可空类型。可空值类型的非空值被装箱,就好像它一开始是不可空的,空值被装箱到一个简单的空引用。 (即实际上没有创建框 - 运行时只返回 null)。您可以从空引用或基础类型的框拆箱为可为空的值类型。那有意义吗? (我在 C# in Depth 中更详细地介绍了它,希望更清楚一点......但它是 8.45,我还没有喝咖啡......)
编辑:好的,也许一个例子会有所帮助:
int? i = 5;
int? j = null;
object x = i; // x = reference to boxed int (there's no such thing as a "boxed nullable int")
object y = j; // y = null (a simple null reference)
i = (int?) x; // Unboxing from boxed int to int? is fine.
j = (int?) y; // Unboxing from a null reference to int? is fine too.
关于c# - 在 .Net 2.0 中使用可空类型时,有什么我应该担心的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406293/