可空类型:在值类型后面加上?,就可以将 null 赋值给值类型。声明方式:datatype? 如,int? a = null;
值类型与引用类型的一个重要区别是:引用类型可以为空,值类型不能。而某些特殊情况(如把C#中数字映射到数据库类型时,数据库的数字可以为空),此时对于大量的数据使用引用类型会增加GC(垃圾回收器)的工作,影响性能。因为只需要在值类型的基础上加上一个 null 值,所以使用可空类型更加方便。
注意:可空类型只对值类型有效。(值类型包括:结构体,枚举类型),委托是引用类型。
public class TT
{
// 值类型(int)
int a = 0;
// 可空类型:值可以为空
int? b = null;
// 可空类型(结构体)
TTT? cc = null;
delegate void DD();
// 引用类型(委托)
DD dd = null;
}
public struct TTT
{
}
可空类型的使用:
1、值类型可以隐式转换为对应的可空类型
2、可空类型转换成值类型要进行显示转换,但要注意,转换前要先判断可空类型的值是否为空,为空时转换会抛出异常。
3、通常可空类型的值参与运算时,只要有一个的操作数为 null ,结果也为空。
4、比较可空类型时,只要有一个操作数为 null ,结果就为 false。
public class TTTT
{
// 可空类型变量 a,b
int? a = null;
int? b = 1;
public TTTT()
{
int c = 0;
int d = 0;
// int 可以隐式转换成 int?
b = d;
// int? 转换成 int 必须要显示转换,并且转换前要进行安全检查,防止原值为 null
if(a != null)
{
// 显示转换
c = (int)a;
}
// a 和 b 只要有一个为 null ,结果为 null
int? e = a + b; // e = null
int? e1 = b + 1; // e1 = 2
// a 和 b 只要有一个为 null ,结果为 false
if(a > b)
{
}
}
}