注意:
我已经阅读了整个这个帖子和许多其他帖子,但我找不到像这样彻底的答案。
由此我彻底明白了“为什么用??,什么时候用??,怎么用??。”
来源:
Craig McMurtry 开发的 Windows 通信基础
国际标准书号 0-672-32948-4
可空值类型
有两种常见的情况,人们想知道是否
已将值分配给值类型的实例。第一种是当实例表示数据库中的值时。在这种情况下,人们希望能够检查实例以确定数据库中是否确实存在值。与本书主题更相关的另一种情况是,实例表示从某个远程源接收的数据项。同样,人们想从实例中确定是否收到了该数据项的值。
.NET Framework 2.0 合并了一个泛型类型定义,该定义提供了这样的情况,在这些情况下,人们希望将 null 分配给值类型的实例,并测试该实例的值是否为 null。该泛型类型定义是System.Nullable<T>,它将可以替代 T 的泛型类型参数限制为值类型。
从System.Nullable<T> 构造的类型的实例可以赋值为null;实际上,它们的值默认为空。因此,类型由
System.Nullable<T> 可以称为可空值类型。
System.Nullable<T> 有一个属性 Value,通过该属性将值分配给
如果实例的值不为空,则可以获取由它构造的类型。
因此,可以这样写:
System.Nullable<int> myNullableInteger = null;
myNullableInteger = 1;
if (myNullableInteger != null)
{
Console.WriteLine(myNullableInteger.Value);
}
C# 编程语言提供了一种用于声明类型的缩写语法
从System.Nullable<T> 构造。该语法允许缩写:
System.Nullable<int> myNullableInteger;
到
int? myNullableInteger;
编译器将阻止人们以这种方式尝试将可空值类型的值分配给普通值类型:
int? myNullableInteger = null;
int myInteger = myNullableInteger;
它阻止了这样做,因为可空值类型可能具有 null 值,在这种情况下它实际上会具有该值,并且该值不能分配给普通值类型。虽然编译器会允许这段代码,
int? myNullableInteger = null;
int myInteger = myNullableInteger.Value;
第二条语句将导致抛出异常,因为任何尝试
访问System.Nullable<T>.Value 属性是一个无效的操作,如果类型
从 System.Nullable<T> 构造的未分配有效的 T 值,在这种情况下没有发生。
结论:
将可空值类型的值分配给普通值类型的一种正确方法是使用System.Nullable<T>.HasValue 属性来确定是否已将有效值 T 分配给可空值类型:
int? myNullableInteger = null;
if (myNullableInteger.HasValue)
{
int myInteger = myNullableInteger.Value;
}
另一种选择是使用这种语法:
int? myNullableInteger = null;
int myInteger = myNullableInteger ?? -1;
普通整数 myInteger 被分配了一个可空整数“myNullableInteger”的值,如果后者被分配了一个有效的整数值;否则,myInteger 的值为 -1。