1、? 的使用
第一种:可空类型修饰符(?),即定义数据类型可为空
目的是用于对int
,double
,bool
等无法直接赋值为null
的类型进行null
的赋值
int i; //--> default value is 0 int? valueOfNull; //--> default value is null
说明
引用类型可以使用空引用,表示一个不存在的值,而值类型通常不能表示为空。
例如:
string str = null; 是正确的,
int i = null; 编译器就会报错。
为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?"来表示,表现形式为"T?"
例如:
int? 表示可空的整型,
DateTime? 表示可为空的时间。
T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当你用到T?时,编译器编译 时会把T?编译成 System.Nullable的形式。
例如:int? 编译后便是System.Nullable的形式。
第二种:用于判断对象是否为null
? 用于判断对象是否为 null 时,
如果对象为null,则不管调用什么都不会抛出异常,直接返回null ;
如果对象不为null,则返回 ? 右边的值;
Pen redPen = new Pen(); redPen.showColor(); Pen nullPen = null; nullPen?.showColor(); // 这里将不会引起异常 Pen testNullPen = null; testNullPen.showColor(); // 这里将会抛出异常
2、?? 的使用
空合并运算符(??)
用于定义可空类型和引用类型的默认值。
?? 如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。
例如:
a ?? b 当 a 为 null 时则返回 b,a 不为 null 时则返回 a 本身。
空合并运算符为右结合运算符,即操作时从右向左进行组合的。
例如:
“ a ?? b ?? c ” 的形式按 “a ?? (b ?? c)” 计算。
string name = null; name = name ?? "Alex"; // --> if name is null, return Alex ; so name = "Alex"
//“ a ?? b ?? c ” 的形式按 “ a ?? (b ?? c) ” 计算。 string aa = null, bb = "bb", cc = null, ff = "ff"; string dd = aa ?? bb ?? cc; //bb string ee = bb ?? aa ?? cc; //bb string gg = bb ?? cc ?? ff; //bb Console.WriteLine("dd={0}", dd); Console.WriteLine("ee={0}", ee); Console.WriteLine("gg={0}", gg);
运行结果