前言
在 C# 中,问号(?)远不止是一个简单的标点符号。随着语言版本的迭代更新,C# 围绕问号(?)发展出了一套强大而优雅的空值处理和条件表达机制。熟练掌握这些操作运算符不仅能大幅提升代码的简洁性和可读性,还能有效避免恼人的空引用异常,构建更加健壮的应用程序。
可空类型修饰符(?)
在 C# 中,值类型(如 int、long、bool、DateTime 等)默认不能为 null。使用 ? 修饰符,我们可以将值类型转换为可空类型。
int notNullableInt;// 非空int类型默认为 0 int? nullableInt = null; bool? nullableBool = null; long? nullableLong = null; DateTime? nullableDate = null;
// 检查是否有值 if (nullableInt.HasValue) { Console.WriteLine($"整数值: {nullableInt.Value}"); } else { Console.WriteLine("变量没有值(为null)"); }
复制代码
Null 合并运算符(??)
Null 合并运算符(??)如果左边的值不为 null,则返回左边的值,否则返回右边的值。
static void Main(string[] args) { string userName1 = "小明"; string userName2 = null; var getUserName = userName1 ?? userName2 ?? "默认用户";
Console.WriteLine(getUserName); // 输出: 小明
string config1 = null; string config2 = null; string config3 = "DefaultConfig"; string finalConfig = config1 ?? config2 ?? config3 ?? "FallbackConfig"; Console.WriteLine(finalConfig); // 输出: DefaultConfig }
复制代码
Null 合并赋值运算符(??=)
C# 8.0 引入的运算符,仅当左操作数为 null 时,才将右操作数的值赋给左操作数。这是懒加载模式的理想选择。
static void Main(string[] args) { string? name = null; name ??= "时光者"; Console.WriteLine(name); // 时光者
name ??= "大姚"; // 不改变 Console.WriteLine(name); // 时光者
//惰性初始化 Dictionary<string, string>? cache = null;
cache ??= new Dictionary<string, string>(); cache["UserName"] = name;
Console.WriteLine(cache["UserName"]); }
复制代码
三元条件运算符(?:)
条件运算符(?:),又称三元运算符,是一种简洁的条件表达式形式。它对布尔表达式进行求值,并根据结果为 true 或 false,选择性地返回两个表达式中的对应结果,为简单条件判断提供了一种比传统 if-else 语句更紧凑、表达力更强的语法形式。
static void Main(string[] args) { int score = 80; string level = score >= 60 ? "Pass" : "Fail"; Console.WriteLine(level); }
复制代码
Null 条件成员访问运算符 (?.)
Null 条件成员访问运算符 (?.) 在访问对象成员(属性、方法、字段等)前先检查对象是否为 null。如果对象为 null,整个表达式返回 null 而不会抛出 NullReferenceException;如果对象不为 null,则正常访问成员。
static void Main(string[] args) { // 基本用法 Person person = null; string name = person?.Name; // 不会抛出异常,name 为 null Console.WriteLine(name ?? "name is null"); // 输出: name is null }
复制代码
Null 条件索引访问运算符 (?[])
Null 条件索引访问运算符 (?[]) 在使用索引器访问集合元素前先检查集合对象是否为 null。如果集合为 null,整个表达式返回 null 而不会抛出异常;如果集合不为 null,则正常访问索引位置的元素。
static void Main(string[] args) { List<string> names = null; string firstName = names?[0]; // 不会抛出异常,firstName 为 null Console.WriteLine(firstName ?? "No names available"); // 输出: No names available
// 初始化列表后访问 names = new List<string> { "时光者", "小袁", "大姚" }; string secondName = names?[0]; // 安全访问索引为0的元素 Console.WriteLine(secondName); // 输出: 时光者 }
复制代码
C#/.NET/.NET Core 面试宝典
本文已收录至 C#/.NET/.NET Core 面试宝典中,更新 C#/.NET/.NET Core 面试干货前往开源地址查看:
评论