? 可空运算符
? 单个问号 代表可空运算符
,能够强制让一些不可为空的类型附上null
引用类型可以使用空引用表示一个不存在的值,
值类型通常不能表示为空。
比如:
string str=null; // 正确的,int i=null; // 错误的,编译器就会报语法错误。
为了使值类型也可为空,就可以使用可空类型。即用可空类型修饰符"?“来表示,表现形式为"T?”
例如:int? 表示可空的整形,DateTime? 表示可为空的时间。
T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当你用到T?时编译器编译 时会把T?编译成System.Nullable的形式。
例如:int?,编译后便是System.Nullable的形式。
int? i = null ; //正确的,此时不会再有语法错误
?? 空合并运算符
用于定义可空类型和引用类型的默认值,如果左操作数为null则返回右操作数,否者返回左操作数。
应用:
int? a=b??c;
注意:
空合并运算符为右结合运算符
,即操作时从右向左进行组合的
。如,“a??b??c”的形式按“a??(b??c)”计算。
?. null检测运算符(判空运算符)
可以跟在参数或者表达式后,不为null时才能执行后面的操作。
列如:
GameObejct?.GetComponent<Rigidbody>();
如果GameObject为null则直接返回一个null不在执行后续操作。
如果GameObject不为空则去得到Rigidbody组件。
由于GetComponent的方法是可能出现报错的,但是如果GameObject为null就可以不在继续执行。
效果等同于:
if(GameObejct != null)GameObejct.GetComponent<Rigidbody>();
?[] 数组null检查运算符
int[] num = null;
var temp = num?[1];
// temp = null
可以自动检测进行NULL检测,不过在使用时要注意数组越界问题。
int[] num = { 3, 6, 92, 8 };
var temp = num1 ?[1];
// temp = 6