C#中的 ?,??, ?. ,?[] 四个个问号运算符

? 可空运算符

? 单个问号 代表可空运算符,能够强制让一些不可为空的类型附上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;

我在写单例的时候有用到
C#中的 ?,??, ?. ,?[] 四个个问号运算符_第1张图片
其他用经常用到的地方:C#中的 ?,??, ?. ,?[] 四个个问号运算符_第2张图片
用来判断物体是否为空,不为null是得到物体,节约码量,提高效率,方便阅读

注意:
空合并运算符为右结合运算符,即操作时从右向左进行组合的。如,“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

你可能感兴趣的:(c#,开发语言)