简单说来,可空数据类型就是包含了所定义的数据类型或者值的空(null)的类型。C#的ECMA-334标准提供了对所有C#值类型的可空版本的描述。
定义可空类型
定义可空类型和非可空类型基本类似,不同的是采用了?来表示。如定义一个整型,你可以使用简单的语句:
int myInt = 1; |
int? myNullableInt = 1; |
double? myDouble = 3.1415926; double? myOtherDouble = null; |
使用可空类型
可空类型可以像普通值类型一样的使用。事实上,可以使用内建的隐式转换来转换相同类型的可空变量和非可空变量。这意味着你可以在一个标准整型和可空整型之间相互转换:
int? nFirst = null; int Second = 2; nFirst = Second; // 有效 nFirst = 123; // 有效 Second = nFirst; // 同样有效 nFirst = null; // 有效 Second = nFirst; // 例外,后者是非空类型 |
if (nFirst.HasValue) Second = nFirst; |
使用可空类型的操作符
虽然可以使用相同值类型的可空和非可空变量的转换,也必须对操作符进行一些改变使得它们可以处理可空和非可空值。这些操作符被称为提升的操作符。
考虑如下代码:
int ValA = 10; int? ValB = 3; int? ValC = ValA * ValB; |
int ValA = 10; int? ValB = null; int? ValC = ValA * ValB; |
如果ValC不为可空类型呢?如下的代码会有什么样的结果?
int ValA = 10; int? ValB = null; int ValC = ValA * ValB; // ValC 不为可空类型 |
比较
比较将会和数学计算操作类似的方式处理。比较的操作数将同时被提升为可空的。这样就可以比较了,如果某个操作数为空,那么比较结果为false。
如果对比是否相等,两个同为空的变量将被认为是相等的。一个空变量和其他任意值的变量相比的结果是不相等。下面是一些比较的例子:
int abc = 123; int xyz = 890; int? def = null; int? uvw = 123; Comparison Result abc == xyz // false abc == def // false def == null // true abc == uvw // true uvw == null // false uvw != null // true |
Comparison Result abc > uvw // false, they are equal abc < def // false, def is null uvw < def // false, because def is null def > null // false, because right side is null uvw > null // false, because right side is null |
C#在新版本中加入了一个新的操作符,它被称为空接合操作符,使用如下的格式:
returnValue = first second; |
如果你希望可空变量的值到一个非可空的版本,你可以这样做:
int? ValA= 123; int? ValB = null; int NewVarA = ValA ?? -1; int NewVarB = ValB ?? -1; |
结束语
总得来说,最新的C#允许一个可空类型的存在。语言内部建立了对可空类型的处理机制。可空类型使得数据库记录和其他可选信息更加的容易处理。
可空类型是C# ECMA-334版本的一个特性。你需要一个支持这个版本的C#的编译器。Visual Studio 2005支持这个版本。