c# - 在 .Net 2.0 中使用可空类型时,有什么我应该担心的吗?

标签 c# nullable

C# 2.0 使我能够访问可空类型。当我希望数据库中的 DateTime 变量为空时,这似乎非常方便。在使用可空类型时,有什么我应该担心的吗?或者我是否可以过火并使我拥有的每种类型都可以为空?

最佳答案

Mitch 的 DBNull 不为空是一个很好的观点。还要注意这一点,这是合法的 C# 但会(幸运的是)产生警告:

int x = 0;

// Much later
if (x == null)

看起来它应该是非法的,但它是有效的,因为 x 可以隐式转换为可为空的 int。切勿忽略此警告。

您还应该了解表面上看起来与运营商有什么不同之处。例如,通常您会期望:

if (x <= y || x >= y)

总是为真 - 但当 xy 都为 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/

相关文章:

c# - 在 C# 中访问可空值的最佳方式

C#。如何为 bool 变量分配特定值(不是 true 也不是 false)?

c# - JavaScript 中 `?` 存在的意义是什么?

c# - 可空列表 <> 作为输出参数

c# - 在 C# 中序列化和反序列化 Oracle.DataAccess.OracleException

c# - 如何并行运行 MSpec 测试程序集?

c# - MODI.Image 来自(位图)图像未保存在硬盘上。

c# - C# 7 中 ValueTuple 的 KeyValuePair 命名

c# - 如何在不更改引用的情况下将两个字符串添加在一起

java - 为什么基元不能为空