1、条件操作符,也是三元操作符
格式 //condition?consequence:alternative
举例:
bool result;
int a = 10, b = 20;
result = a > b ? true : false;
2、空接合操作符(输出的结果一定不为null)
格式 //expression1??expression2
string str = GetName() ?? "default";
string str2 = GetName() ?? GetName2();
3、 null条件操作符(考虑调用成员的方法或者属性之间都要先判断是否为空而来)
string[] Array1 = new string[] { "1", "2" };
string[] Array2 = new string[] { };
int? length = Array1?.Length;//Array1如果为null则返回0,如果不为null,则返回int?可空类型
int? length2 = Array2?.Length;//Array2如果为null则返回0,正常情况下不可能为0,所以我们可以根据返回的结果是否为0来判断,如果不为null,则返回int?可空类型
int? length3 = Array2[0]?.Length;//会报错,错误是超出索引界限,所以这里要尽量避免Null条件操作符和索引操作符一起使用
4、null条件操作符和委托
为什么要对委托进行Null值得判断?
第一种情况(就是容易出现问题的情况)
public delegate void GetMaxDelegate();
public event GetMaxDelegate getMaxEvent;
getMaxEvent += TestDelegate1;
getMaxEvent += TestDelegate2;
if(getMaxEvent!=null)
{
getMaxEvent -= TestDelegate1;//可能在另一个线程发生
getMaxEvent -= TestDelegate2;//可能在另一个线程发生
getMaxEvent();//会报错,错误为System.NullReferenceException
}
第二种情况(传统对委托的判断,事件是特殊的委托))
getMaxEvent += TestDelegate1;
getMaxEvent += TestDelegate2;
GetMaxDelegate getMaxEvent2 = getMaxEvent;
if(getMaxEvent2 !=null)
{
getMaxEvent -= TestDelegate1;
getMaxEvent -= TestDelegate2;
getMaxEvent2();
}
因为执行 getMaxEvent -= TestDelegate1操作的时候,会让getMaxEvent指向全新的委托,而不会更改原始的委托,这样getMaxEvent2因为指向原始的委托,所以也不会发生更改。
第三种情况(使用null条件操作符实现和第二种情况一样的效果)
getMaxEvent += TestDelegate1;
getMaxEvent += TestDelegate2;
getMaxEvent?.Invoke();