这篇文章主要介绍了C#中检查null的语法糖有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中检查null的语法糖有哪些文章都会有所收获,下面我们一起来看看吧。函数参数null检查传统写法写一个函数的时
这篇文章主要介绍了C#中检查null的语法糖有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中检查null的语法糖有哪些文章都会有所收获,下面我们一起来看看吧。
写一个函数的时候,最经典的检查,估计也是大家最常使用的null检查,应该是这样的吧:
public static void GetV1(string prompt){ if (prompt is null) throw new ArgumentNullException(nameof(prompt)); Console.WriteLine(prompt);}
这个写起来也没啥问题,但是总觉得有点不舒适。.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刚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;
说起这个,就顺便说说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";
关于“C#中检查null的语法糖有哪些”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#中检查null的语法糖有哪些”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。
--结束END--
本文标题: C#中检查null的语法糖有哪些
本文链接: https://lsjlt.com/news/327952.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0