C# ?问号运算符知多少

总结一下C#中问号有三种

第一:三目操作运算符【 ? : 】

问号前面的是条件,后面的是结果,条件满足返回冒号前面的值否则后面的值

事例

[csharp]  view plain  copy
  1. <span style="white-space:pre">    </span>public int WhoBig(int a, int b)  
  2.         {  
  3.             return a > b ? a : b;  
  4.         }  
  5.   
  6.         public int WhoSmall(int a, int b)  
  7.         {  
  8.             return a < b ? a : b;  
  9.             //等价于  
  10.             /*if (a < b) 
  11.                 return a; 
  12.             else 
  13.                 return b; 
  14.              * */  
  15.         }  

第二:基本数据类型可空标识符【?】

声明的变量可以为空,比如int,string,但是布尔值为空依然报错

事例

[csharp]  view plain  copy
  1. <span style="white-space:pre">    </span>int i = null;//报错  
  2.         bool j = null//报错  
  3.   
  4.         int? k = null;//通过  
  5.         bool? m = null//报错  

第三:null合并运算符【??】

赋值的结果中的变量如果为空则用??后面的值替代前面的变量,否则直接用前面的变量

如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数

事例

[csharp]  view plain  copy
  1. <span style="white-space:pre">    </span>public string Hongyan(string a)  
  2.         {  
  3.             string res = a;  
  4.             if (a == null)  
  5.                 res = "";  
  6.             //等价于  
  7.             res = a ?? "";  
  8.             return res;  
  9.         }  


如果a为空就选择??后面的值否则前面的值


第四:null条件运算符【?.】

用于在执行成员访问 (?.) 或索引 (?[) 操作之前,测试是否存在 NULL。 这些运算符可帮助编写更少的代码来处理 null 检查,尤其是对于下降到数据结构。

[csharp]  view plain  copy
  1. int? length = customers?.Length; // null if customers is null   
  2. Customer first = customers?[0];  // null if customers is null  
  3. int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null  



最后一个示例演示 NULL 条件运算符会短路。 如果条件成员访问和索引操作链中的某个操作返回 NULL,则该链其余部分的执行将停止。 表达式中优先级较低的其他操作将继续。 例如,以下的示例中的 E 将始终执行,?? 和 == 操作将执行。

[csharp]  view plain  copy
  1. A?.B?.C?[0] ?? E  
  2. A?.B?.C?[0] == E  



NULL 条件成员访问的另一个用途是使用非常少的代码以线程安全的方式调用委托。 旧方法需要如下所示的代码:

[csharp]  view plain  copy
  1. var handler = this.PropertyChanged;  
  2. if (handler != null)  
  3.     handler(…)  


新的方法是要简单得多:

[csharp]  view plain  copy
  1. PropertyChanged?.Invoke(e)  



新方法是线程安全的,因为编译器生成代码以评估 PropertyChanged(仅一次),从而使结果保持在临时变量中。
你需要显式调用 Invoke 方法,因为不存在 NULL 条件委托调用语法 PropertyChanged?(e)。 有太多不明确的分析情况来允许它。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值