c#处理null的几个语法糖,非常实用。(尤其是文末Dictionary那个案例,记得收藏)

??
如果左边是的null,那么返回右边的操作数,否则就返回左边的操作数,这个在给变量赋予默认值非常好用。

int? a = null;
int b = a ?? -1;
Console.WriteLine(b); // output: -1

??=
当左边是null,那么就对左边的变量赋值成右边的

int? a = null;
a ??= -1;
Console.WriteLine(a); // output: -1

?.
当左边是null,那么不执行后面的操作,直接返回空,否则就返回实际操作的值。

using System;
public class C {
public static void Main() {
string i = null;
int? length = i?.Length;
Console.WriteLine(length ?? -1); //output: -1
}
}

?[]
索引器操作,和上面的操作类似

using System;
public class C {
public static void Main() {
string[] i = null;
string result = i?[1];
Console.WriteLine(result ?? "null"); // output:null
}
}

注意,如果链式使用的过程中,只要前面运算中有一个是null,那么将直接返回null结果,不会继续计算。下面两个操作会有不同的结果。

using System;
public class C {
public static void Main() {
string[] i = null;
Console.WriteLine(i?[1]?.Substring(0).Length); //不弹错误
Console.WriteLine((i?[1]?.Substring(0)).Length) // System.NullReferenceException: Object reference not set to an instance of an object.
}
}

一些操作

//参数给予默认值
if(x == null) x = "str";
//替换
x ??= "str"; //条件判断
string x;
if(i<3)
x = y;
else
{
if(z != null) x = z;
else z = "notnull";
}
//替换
var x = i < 3 ? y : z ?? "notnull" //防止对象为null的时候,依然执行代码
if(obj != null)
obj.Act();
//替换
obj?.Act(); //Dictionary取值与赋值
string result;
if(dict.ContainKey(key))
{
if(dict[key] == null) result = "有结果为null";
else result = dict[key];
}
else
result = "无结果为null";
//替换
var result= dict.TryGetValue(key, out var value) ? value ?? "有结果为null" : "无结果为null";

最新文章

  1. DDD 领域驱动设计-两个实体的碰撞火花
  2. MongoDB做为一项windows服务启动
  3. js保留两位小数
  4. scrollViewDidEndScrollingAnimation和scrollViewDidEndDecelerating的区别
  5. Spring知识汇总
  6. bootstrap插件学习-bootstrap.alert.js
  7. jquery升级换代
  8. 用ATL写简单的ActiveX控件 .
  9. HTTP手记
  10. javascript 原型及原型链详解
  11. 用js来实现那些数据结构06(队列)
  12. Runtime - ③ - 分类Category探究
  13. c/c++ 继承与多态 继承中的public, protected, private
  14. CF1121C 模拟
  15. 解决linux环境mysql的sql语句严格区分大小写问题
  16. MySql 三大知识点,索引、锁、事务,原理分析
  17. NSIS控制面板中显示安装包的大小和禁止多个安装程序实例
  18. LNMP(二)
  19. whiledo循环输出9-0
  20. 「Vue」登陆-路由拦截器

热门文章

  1. javascript编程单线程之异步模式Asynchronous
  2. 题解 CF803A Maximal Binary Matrix
  3. python tcp select 多路复用
  4. python中展示json数据不换行(手动换行)
  5. Dubbo-聊聊通信模块设计
  6. CSP-S2022 游寄
  7. ubuntu undefined reference to
  8. (C++) std::move std::forward及使用
  9. 使用lamdba查询datatable中的一个值或者单元格
  10. HDC2022的无障碍参会体验,手语服务是如何做到的?