详解C#中检查null的语法糖

作者:波多尔斯基 时间:2023-08-12 11:20:08 

今天看到已经更新了devblogs,新增的C# 11的!!(用于检查null的语法)经过非常长的讨论,最后取消了。然后我又想起来null检查,这个可以说一说。

函数参数null检查

传统写法

写一个函数的时候,最经典的检查,估计也是大家最常使用的null检查,应该是这样的吧:

public static void GetV1(string prompt)
{
   if (prompt is null) throw new ArgumentNullException(nameof(prompt));
   Console.WriteLine(prompt);
}

ThrowIfNull

这个写起来也没啥问题,但是总觉得有点不舒适。.NET 6在ArgumentNullException中新增了ThrowIfNull方法,可以写的更优雅一点。

public static void GetV2(string prompt)
{
   ArgumentNullException.ThrowIfNull(prompt);
   Console.WriteLine(prompt);
}

异常的时候,就会出现:System.ArgumentNullException: 'Value cannot be null. (Parameter 'prompt')'。这个是不是简单了点?可是还是需要写一行。

C# 11的!!语法(已经取消)

C# 11刚preview的时候,我就瞄到了这个特性,现在依然可以通过设置preview来进行启用,但是以后正式发布估计就不行了。

它通过在参数后面叠加!!表示此参数不可为空,运行时会自动进行检查,如果是null就直接弹出错误。

public static void GetV3(string prompt!!)
{
   Console.WriteLine(prompt);
}

这个代码会被编译器翻译成:

public static void GetV3(string prompt!!)
{
   if (prompt is null) {
       throw new ArgumentNullException(nameof(prompt));
   }
   Console.WriteLine(prompt);
}

这样大家就可以专注于业务代码,不需要经常考虑异常检查了。至于为什么这个东西最后还是被删除了,可以从讨论中看到一丝端倪,首先是感觉非常纠结于这个语法,两个叹号;然后就是已经有比较多的方式可以实现检查了,这个东西是否有必要。反正最终是以后再讨论了,不过也可以看出来C#语言工作组对语言的特性讨论非常谨慎。

他们还讨论了很多别的形式,每种都提出了各自的优缺点挺有意思的,能看出来有一点设计语言的严谨和小强迫症在,点赞~

void M(string s!!);
void M(string! s);
void M(string s!);
void M(notnull string s);
void M(string s ?? throw);
void M(string s is not null);
void M(checked string s);
void M(string s) where s is not null;

有关null的一些操作

说起这个,就顺便说说c#处理null的另外几个语法糖吧。

??

如果左边是的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";

来源:https://www.cnblogs.com/podolski/p/16184027.html

标签:C#,检查null,语法糖
0
投稿

猜你喜欢

  • Springboot配置security basic path无效解决方案

    2023-07-12 21:42:50
  • Android实现背景图片轮播

    2023-09-05 00:16:27
  • Android Volley框架使用源码分享

    2023-09-10 09:43:44
  • C#实现一阶卡尔曼滤波算法的示例代码

    2022-12-23 05:28:45
  • c# 配置文件App.config操作类库的方法

    2023-01-19 10:34:37
  • Android巧用ActionBar实现tab导航效果

    2022-06-02 05:49:18
  • java实现递归文件列表的方法

    2022-10-13 13:17:00
  • Java集合删除元素ArrayList实例详解

    2022-11-09 19:12:39
  • java @Value(

    2023-10-05 02:54:47
  • android WebView加载html5介绍

    2021-12-29 17:43:44
  • Android DataBinding类关系深入探究

    2022-08-17 19:23:51
  • Spring boot @RequestBody数据传递过程详解

    2022-09-14 12:23:37
  • Java枚举类使用Lombok方式

    2022-06-28 22:07:02
  • C++ 反汇编之关于Switch语句的优化措施

    2023-09-10 15:00:15
  • Recyclerview添加头布局和尾布局、item点击事件详解

    2022-04-19 12:38:12
  • Java实现一个顺序表的完整代码

    2023-09-21 01:00:59
  • C#在子线程中更新窗口部件的写法

    2022-04-01 09:57:50
  • 使用RecyclerView实现水平列表

    2022-04-25 19:27:13
  • 基于Java文件输入输出流实现文件上传下载功能

    2023-08-10 11:50:32
  • 详解Java数据结构之平衡二叉树

    2022-05-06 08:54:13
  • asp之家 软件编程 m.aspxhome.com