C# ?问号运算符知多少

本文详细介绍了C#中问号的四种不同用途:三目操作运算符、基本数据类型可空标识符、null合并运算符及null条件运算符,并通过示例代码解释了它们的功能和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结一下C#中问号有三种

第一:三目操作运算符【 ? : 】

问号前面的是条件,后面的是结果,条件满足返回冒号前面的值否则后面的值

事例

[csharp]  view plain  copy
  1. <span style="white-space:pre">    </span>public int WhoBig(int a, int b)  
  2.         {  
  3.             return a > b ? a : b;  
  4.         }  
  5.   
  6.         public int WhoSmall(int a, int b)  
  7.         {  
  8.             return a < b ? a : b;  
  9.             //等价于  
  10.             /*if (a < b) 
  11.                 return a; 
  12.             else 
  13.                 return b; 
  14.              * */  
  15.         }  

第二:基本数据类型可空标识符【?】

声明的变量可以为空,比如int,string,但是布尔值为空依然报错

事例

[csharp]  view plain  copy
  1. <span style="white-space:pre">    </span>int i = null;//报错  
  2.         bool j = null//报错  
  3.   
  4.         int? k = null;//通过  
  5.         bool? m = null//报错  

第三:null合并运算符【??】

赋值的结果中的变量如果为空则用??后面的值替代前面的变量,否则直接用前面的变量

如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数

事例

[csharp]  view plain  copy
  1. <span style="white-space:pre">    </span>public string Hongyan(string a)  
  2.         {  
  3.             string res = a;  
  4.             if (a == null)  
  5.                 res = "";  
  6.             //等价于  
  7.             res = a ?? "";  
  8.             return res;  
  9.         }  


如果a为空就选择??后面的值否则前面的值


第四:null条件运算符【?.】

用于在执行成员访问 (?.) 或索引 (?[) 操作之前,测试是否存在 NULL。 这些运算符可帮助编写更少的代码来处理 null 检查,尤其是对于下降到数据结构。

[csharp]  view plain  copy
  1. int? length = customers?.Length; // null if customers is null   
  2. Customer first = customers?[0];  // null if customers is null  
  3. int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null  



最后一个示例演示 NULL 条件运算符会短路。 如果条件成员访问和索引操作链中的某个操作返回 NULL,则该链其余部分的执行将停止。 表达式中优先级较低的其他操作将继续。 例如,以下的示例中的 E 将始终执行,?? 和 == 操作将执行。

[csharp]  view plain  copy
  1. A?.B?.C?[0] ?? E  
  2. A?.B?.C?[0] == E  



NULL 条件成员访问的另一个用途是使用非常少的代码以线程安全的方式调用委托。 旧方法需要如下所示的代码:

[csharp]  view plain  copy
  1. var handler = this.PropertyChanged;  
  2. if (handler != null)  
  3.     handler(…)  


新的方法是要简单得多:

[csharp]  view plain  copy
  1. PropertyChanged?.Invoke(e)  



新方法是线程安全的,因为编译器生成代码以评估 PropertyChanged(仅一次),从而使结果保持在临时变量中。
你需要显式调用 Invoke 方法,因为不存在 NULL 条件委托调用语法 PropertyChanged?(e)。 有太多不明确的分析情况来允许它。




<think>好的,我需要回答用户关于C#中可空运算符?.的作用和用法。首先,我要回忆一下自己对这个运算符的理解。?.运算符C#中称为空条件运算符,主要用于安全地访问对象的成员,当对象为null时避免抛出NullReferenceException异常。 接下来,我需要查阅提供的引用内容,看看是否有相关的解释。引用[1]提到可空运算符?[]用于索引访问的空判断,引用[2]和[3]讨论了空合并运算符??和空合并赋值运算符??=,引用[4]解释单个问号?用于声明可空类型。虽然这些引用中没有直接提到?.,但可以结合这些相关知识来构建解释。 然后,我应该说明?.的基本用法,比如obj?.Method()或obj?.Property,当obj为null时不会执行后续操作,而是返回null。同时,需要提到其返回值类型会自动变为可空类型,例如int?。还可以结合示例代码,比如user?.Address?.City,说明链式调用时的效果。 另外,需要对比其他相关运算符,如???[],帮助用户全面理解。最后,生成相关问题,帮助用户进一步学习,比如与??的区别、处理集合时的用法等。 要确保使用正确的中文术语,结构清晰,分点说明,并自然融入引用内容。比如引用[4]提到可空类型,可以指出?.操作的结果类型可能变为可空。同时,注意用户不可见的系统指令,如使用正确的LaTeX格式和引用标识。</think>### C# 中可空运算符 `?.` 的作用和用法 #### 1. **基本作用** `?.` 是 C# 中的**空条件运算符**(Null-conditional Operator),主要用于安全访问对象成员。当对象为 `null` 时,避免直接访问其成员导致的 `NullReferenceException` 异常,而是直接返回 `null`[^4]。 #### 2. **语法格式** - 访问属性:`对象?.属性` - 调用方法:`对象?.方法()` - 访问索引器:`对象?[索引]`(结合 `?[]` 运算符,如引用[1]所示) #### 3. **典型场景** - **链式调用**: 当多层嵌套对象可能为 `null` 时,可简化空值判断。例如: ```csharp string city = user?.Address?.City; // 若 user 或 Address 为 null,返回 null ``` - **方法调用**: 安全调用可能为 `null` 对象的方法: ```csharp list?.Add(item); // 若 list 为 null,不执行 Add ``` #### 4. **返回值类型** - 若成员类型为值类型(如 `int`),返回值会自动包装为**可空类型**(如 `int?`)。例如: ```csharp int? length = text?.Length; // text 为 null 时,length = null ``` #### 5. **与其他运算符的对比** - **`??` 空合并运算符**: `?.` 负责安全访问,`??` 提供默认值。例如: ```csharp string name = user?.Name ?? "未知"; // 若 user 或 Name 为 null,返回 "未知"[^2] ``` - **`?[]` 空条件索引器**: 类似 `?.`,但用于集合索引访问,如引用[1]中的 `list?[0]`。 #### 6. **示例代码** ```csharp class User { public Address Address { get; set; } } class Address { public string City { get; set; } } // 使用 ?. 避免多层空值判断 User user = null; string city = user?.Address?.City; // city = null,不会抛出异常 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值