c# ? .和 ??

文章介绍了在C#中,通过nodes?.Count??0语法来安全地获取集合nodes的元素数量,当nodes可能为null时,避免了NullReferenceException。这是一种条件运算和合并运算的巧妙应用。
var nodesCount = nodes?.Count ?? 0;

nodes :是一个集合

nodes?.Count:null条件运算符 ?. 。

  • 如果 nodes 不为 null,则返回 nodes.Count 的值;
  • 如果 nodes 为 null,则整个表达式的结果为 null,而不会抛出 NullReferenceException。

nodes?.Count ?? 0

  • 如果 nodes?.Count 的结果不为 null,则整个表达式的结果就是 nodes.Count 的值;
  • 如果 nodes?.Count 的结果为 null,则使用 null 合并运算符 ??,返回右侧的值,即 0。

作用:安全地获取 nodes 集合的元素数量,如果 nodes 为 null,则返回 0。可以避免因尝试访问 null 集合的 Count 属性而导致的NullReferenceException

<think>我们正在讨论C#中的空值条件运算符(?.),它用于在访问成员或方法之前检查对象是否为null。如果对象为null,则整个表达式的结果为null,而不会引发NullReferenceException异常。 根据引用[1][4],空值条件运算符可以简化空值检查的代码,使代码更简洁、更安全。 另外,引用[2][3]提到了可空类型以及相关的运算符(如??),它们也是处理空值的重要工具。 用户询问的是使用?.运算符进行空值安全调用的方法。下面我将详细解释: 1. 基本用法:在访问对象的成员(属性、字段、方法)时,在对象后面加上?.,例如:obj?.Property 如果obj为null,则整个表达式返回null(而不会继续访问Property,因此不会抛出异常)。 2. 链式调用:可以连续使用?.,例如:obj?.Property1?.Property2 这样,只要链中的任何一个环节为null,整个表达式就会返回null。 3. 用于方法调用:同样可以安全调用方法,例如:obj?.Method() 如果obj为null,则方法不会被调用,表达式结果为null(如果方法的返回类型是引用类型)或可空值类型(如果方法的返回类型是值类型,则包装成Nullable<T>)。 4.??运算符结合使用:当表达式结果为null时,可以使用??提供默认值,例如:obj?.Property ?? "default" 注意:引用[3]提醒我们不要滥用!运算符(非空断言),因为它会绕过编译器的空检查,可能导致运行时异常。 下面通过代码示例来说明: 假设我们有一个类: ```csharp class Person { public string Name { get; set; } public Address Address { get; set; } } class Address { public string City { get; set; } } ``` 使用?.进行安全调用: ```csharp Person person = null; // 安全访问属性:如果person为null,则name为null,不会抛出异常 string name = person?.Name; // 链式调用:获取person的Address的City,如果person或Address为null,则city为null string city = person?.Address?.City; // 结合??提供默认值 string safeCity = person?.Address?.City ?? "Unknown"; // 安全调用方法(假设Address有一个方法) // 例如,在Address类中有一个方法: // public string GetCity() => City; // 那么可以这样调用: string cityByMethod = person?.Address?.GetCity(); ``` 此外,?.运算符还可以用于集合的索引访问,例如: ```csharp List<int> list = null; int? firstItem = list?[0]; // 如果list为null,则firstItem为null ``` 总结:使用?.运算符可以避免繁琐的空值检查,使代码更加简洁安全。 根据要求,生成相关问题: §§相关问题§§ 1. C#中除了?.运算符,还有哪些处理空值的运算符? 2. 如何正确使用??运算符? 3.C#中,可空引用类型(nullable reference types)是什么?它如何帮助避免空引用异常? 4. 使用空值条件运算符时,如何避免将null传播到不应该出现null的地方?</think>### C# 使用 `?.` 运算符进行空值安全调用的方法 在 C# 中,**空值条件运算符 `?.`**(也称为 Elvis 运算符)用于在访问对象成员前进行空值检查,避免抛出 `NullReferenceException`。其核心原理是:**当左侧对象为 `null` 时,整个表达式直接返回 `null`,不会执行右侧操作**。 #### 基本用法 ```csharp // 传统空值检查(繁琐) string name = null; if (obj != null) { name = obj.Name; } // 使用 ?. 运算符(简洁安全) string name = obj?.Name; // 若 obj 为 null,则 name = null ``` #### 链式调用 可安全访问嵌套属性/方法: ```csharp // 安全访问嵌套属性 string city = customer?.Address?.City; // 任一环节为 null 则返回 null // 安全调用方法 int? length = customer?.Name?.Length; // 返回可空 int? ``` #### 结合其他运算符 1. **与 `??` 提供默认值** ```csharp // 若结果为空则返回默认值 string city = customer?.Address?.City ?? "Unknown"; ``` 2. **与数组/集合索引器** ```csharp // 安全访问数组元素 int? firstValue = list?[0]; // 若 list 为 null 则返回 null ``` 3. **委托/事件的安全调用** ```csharp // 避免事件为空时抛出异常 OnChanged?.Invoke(this, EventArgs.Empty); ``` #### 重要注意事项 1. **返回值类型** - 访问值类型成员(如 `int`)时,返回 `Nullable<T>`(如 `int?`) - 访问引用类型成员(如 `string`)时,返回原类型(如 `string`) 2. **避免滥用 `!` 运算符** 错误方式(隐藏空引用风险): ```csharp int length = customer!.Name!.Length; // 可能抛 NullReferenceException ``` 正确方式: ```csharp int length = customer?.Name?.Length ?? 0; // 安全提供默认值 ``` #### 实际示例 ```csharp class Person { public string Name { get; set; } public Address Address { get; set; } } class Address { public string City { get; set; } } // 安全访问嵌套属性 Person person = null; string city = person?.Address?.City; // 返回 null 而非崩溃 ``` #### 优势总结 1. **代码简洁性**:减少冗余的 `if (obj != null)` 检查[^4] 2. **安全性**:自动阻止空引用异常 3. **可读性**:链式调用更直观表达访问路径 > ⚠️ 注意:`?.` 仅处理左侧对象的空值,若右侧成员本身可能为 `null`(如 `Address` 非空但 `City` 为 `null`),需额外处理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值