c# 如何中的 ? 与 ??

c# 如何中的 ? 与 ??

C# 中的 ?.?? 运算符详解

在 C# 中,?.(null 条件运算符)和 ??(null 合并运算符)是两个非常有用的运算符,用于简化 null 值检查和处理。

1. ?. (Null 条件运算符)

?. 运算符用于在访问成员或元素之前检查对象是否为 null。如果对象为 null,则返回 null 而不抛出异常。

基本用法

string name = person?.Name;
// 等同于
string name = (person != null) ? person.Name : null;

链式调用

int? length = people?.FirstOrDefault()?.Name?.Length;

方法调用

person?.PrintName(); // 如果 person 为 null,则不执行方法

数组/集合访问

int? firstItem = array?[0];

2. ?? (Null 合并运算符)

?? 运算符用于在左侧表达式为 null 时返回右侧的值。

基本用法

string displayName = name ?? "匿名用户";
// 等同于
string displayName = (name != null) ? name : "匿名用户";

?. 结合使用

string name = person?.Name ?? "未知";

链式使用

string configValue = config?.Settings?.Value ?? "默认值";

3. ??= (C# 8.0 引入的 Null 合并赋值运算符)

name ??= "默认值";
// 等同于
if (name == null)
{
    name = "默认值";
}

实际应用示例

class Program
{
    static void Main()
    {
        Person person = null;
        
        // 使用 ?. 避免 NullReferenceException
        string name = person?.Name;
        Console.WriteLine(name); // 输出 null
        
        // 使用 ?? 提供默认值
        string safeName = person?.Name ?? "无名氏";
        Console.WriteLine(safeName); // 输出 "无名氏"
        
        // 复杂示例
        int? age = person?.Age ?? 18;
        Console.WriteLine(age); // 输出 18
        
        // ??= 运算符
        string nickname = null;
        nickname ??= "小新";
        Console.WriteLine(nickname); // 输出 "小新"
    }
}

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

注意事项

  1. ?. 运算符会改变表达式的类型,使其变为可空类型
  2. ?? 右侧的表达式只有在左侧为 null 时才会计算
  3. 这些运算符可以大大减少代码中的 null 检查样板代码
  4. 在性能关键路径上,?. 比手动 null 检查有轻微开销

这两个运算符是现代 C# 编程中处理 null 值的推荐方式,可以使代码更简洁、更安全。

你可能感兴趣的:(c#,开发语言)