C# 如何使用?、? 和 ??的区别和使用案例

目录

? 运算符

使用案例

?? 运算符

使用案例

总结


在 C# 中,? 和 ?? 运算符在处理 null 值时起着不同的作用,并且具有特定的使用场景。

? 运算符

? 运算符,也称为空条件运算符,在 C# 6.0 及更高版本中引入。它允许你在不进行显式类型转换的情况下检查引用类型的变量是否为 null。如果变量为 null,则整个表达式的结果也是 null,并且不会执行 ? 之后的代码块。这有助于避免空引用异常。

使用案例

假设我们有一个方法,该方法返回一个字符串,或者在某些情况下返回 null

string GetNullableString();

如果我们想在返回的字符串上调用一个方法(例如 .Length),直接调用可能会引发异常,因为如果返回的是 null,尝试获取其长度会导致空引用异常。使用 ? 运算符可以安全地解决这个问题:

string result = GetNullableString()?.Length;

如果 GetNullableString() 返回 null,则整个表达式的结果也是 null,不会尝试访问 Length 属性。

?? 运算符

?? 运算符是一个逻辑运算符,也称为空合并运算符。当左侧的操作数为 null 时,它返回右侧的操作数作为结果。如果左侧的操作数不为 null,则返回左侧的操作数。它通常用于为可能为 null 的变量提供一个默认值。

使用案例

假设我们有一个字符串变量,可能没有初始化:

 
string someString;

如果直接访问这个变量的长度,因为它是 null,会抛出空引用异常。我们可以使用 ?? 运算符来提供一个默认值:

int length = someString ?? "default".Length;

如果 someString 是 null,则整个表达式的结果是 0(因为 .Length 会返回字符串的长度),否则是 someString.Length 的值。

可空类型修饰符 (?)

  • 这个符号用于声明一个可空引用类型或值类型。当应用于引用类型时(如 string?),它表示该变量可以存储 null 值,而不仅仅是非空引用。
  • 使用案例:

    string? nullableString = null; // 可以为 null 的字符串

当然,可空类型修饰符 (?) 在 C# 中的应用不仅仅局限于声明可以为 null 的变量,还可以结合 null-conditional 运算符一起使用,进行更便捷的条件访问和方法调用。这里有一个例子:
 

int? value = GetNullableInt(); // 假设这个方法可能返回一个整数或 null

// 使用 null-conditional 运算符 ?. 来安全地访问成员或调用方法
// 如果 value 为 null,则整个表达式结果也为 null,不会抛出 NullReferenceException
int? doubledValue = value?.GetValueOrDefault() * 2;

// 或者在链式调用中使用它来避免空引用异常
string message = value.HasValue ? $"The value is {value.Value}" : "No value provided";
string safeMessage = value?.ToString() ?? "No value provided"; // 如果 value 为 null,则使用默认消息

// 对于集合类,也可以安全检查其元素
List<int>? numbers = GetNullableListOfNumbers();
int firstNumberOrDefault = numbers?.FirstOrDefault(); // 如果 numbers 为 null,则结果为 null
```

在这段代码中,`?.` 是 null-conditional 运算符,与可空类型修饰符一同作用时,它允许我们在访问成员或调用方法时进行安全的条件检查,如果前面的对象是 null,则整个表达式会立即停止计算并返回 null,而不会尝试对 null 引用执行操作导致运行时错误。

总结

  • ? 运算符:用于安全地检查引用类型变量是否为 null,并避免执行可能引发异常的代码块。如果变量为 null,整个表达式的结果也是 null
  • ?? 运算符:用于为可能为 null 的变量提供一个默认值。如果左侧的操作数为 null,则返回右侧的操作数作为结果。
  • 可空类型修饰符 :这个符号用于声明一个可空引用类型或值类型,表示该变量可以存储 null 值,而不仅仅是非空引用

欢迎阅读:

50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)

50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值