有关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# 11提供了一个新的??,话说我个人还是挺喜欢这个特性的,不管以什么形式出现吧,期待以后再见。
C#中为了处理null给我们准备了许多的语法糖,只能说非常简便了。有很多人会说这个可读性不好,或者觉得这是“茴字的几种写法”似的歪门邪道,我只能说,传统的语法也不是说取消了,语言有发展,只要还是比较审慎的,我觉得还是一件好事。