在C#开发过程中,判空是最基础也最高频的操作之一,传统的判空方式往往需要写多层if嵌套,不仅代码冗余,还会降低可读性。借助null合并运算符和模式匹配,我们可以用更简洁的方式完成判空逻辑,让代码更优雅。

null合并运算符判空
null合并运算符包含??和??=两种形式,核心作用是当左侧操作数为null时,返回右侧的默认值,避免冗长的if判断。
?? 运算符用法
当我们需要获取一个可能为null的变量的值,若该变量为null则返回默认值时,使用??可以减少判断代码。
string name = null;
// 传统判空写法
string result1;
if (name == null)
{
result1 = "默认名称";
}
else
{
result1 = name;
}
// 使用??运算符的写法
string result2 = name ?? "默认名称";
??= 运算符用法
??=是C# 8.0引入的运算符,作用是当左侧变量为null时,将右侧的值赋给左侧变量,否则保持原值不变。
string userName = null;
// 传统判空赋值写法
if (userName == null)
{
userName = "游客";
}
// 使用??=运算符的写法
userName ??= "游客";
模式匹配判空
模式匹配可以在判断变量是否为null的同时,完成类型校验或者变量赋值,适合需要同时判断空值和类型的场景。
is null 模式判空
使用is null可以直接判断变量是否为null,比传统的== null更符合模式匹配的逻辑,也支持在判断的同时声明变量。
object obj = null;
// 传统判空写法
if (obj == null)
{
Console.WriteLine("对象为空");
}
// 使用is null判空
if (obj is null)
{
Console.WriteLine("对象为空");
}
类型模式结合判空
当我们需要判断一个变量不为null且属于某个特定类型时,模式匹配可以一步完成,不需要先判空再判断类型。
object data = "测试字符串";
// 传统写法:先判空再判断类型
if (data != null && data is string)
{
string str = (string)data;
Console.WriteLine($"字符串长度:{str.Length}");
}
// 模式匹配写法:同时判断不为null且为string类型,直接赋值给str
if (data is string str)
{
Console.WriteLine($"字符串长度:{str.Length}");
}
两种方式的适用场景
如果只需要做空值替换,优先选择null合并运算符,代码更简短;如果需要在判空的同时判断类型或者做更复杂的逻辑校验,模式匹配会更合适,逻辑更清晰。两种方式结合使用,可以让C#的判空代码更简洁优雅,减少冗余逻辑。