C# 中?、?. 、 ??

发布于:2024-12-18 ⋅ 阅读:(149) ⋅ 点赞:(0)

在 C# 中,?.?? 是两个不同的操作符,它们用于处理可能为 null 的对象。让我们分别解释这两个操作符以及它们的组合使用:
 

1. 可空类型 (?)

在 C# 中,? 用于定义可空值类型(Nullable Value Types)。通常,值类型(如 int, bool, double 等)不能为 null,但通过在这些类型的后面加上 ?,你可以创建一个可以接受 null 的版本

语法:

type? variable;

示例:

int? nullableInt = null; // 可以赋值为 null
bool? nullableBool = true; // 也可以赋值为 true 或 false

2. 空条件运算符 (?.)

空条件运算符(Null-conditional Operators)允许你在访问成员(如属性、方法或索引器)之前检查对象是否为 null。如果对象是 null,则表达式会短路并返回 null,而不会抛出 NullReferenceException

object?.member
string name = person?.Name; // 如果 person 为 null,则 name 也会是 null
int? length = list?.Count;  // 如果 list 为 null,则 length 也会是 null

3. 空合并运算符 (??)

空合并运算符(Null-coalescing Operator)用于定义一个默认值,当左侧的操作数为 null 时,将使用右侧的操作数作为结果。

语法:

expression ?? defaultValue

示例:

string message = customMessage ?? "Default Message";
// 如果 customMessage 为 null,则 message 会被设置为 "Default Message"

4. 组合使用 (?. + ??)

你可以将这两个操作符组合起来使用,以实现更复杂的逻辑。例如,当你想要访问一个可能为 null 的对象的成员,并且希望在该对象或其成员为 null 时提供一个默认值。

示例:

string name = person?.Name ?? "Unknown";
// 如果 person 为 null 或 person.Name 为 null,则 name 会被设置为 "Unknown"

5. 空合并赋值运算符 (??=) (C# 8.0+)

从 C# 8.0 开始,引入了空合并赋值运算符,它可以在左侧表达式为 null 时,将右侧的值赋给左侧的变量。

语法:

variable ??= value;

示例:

string nickname = null;
nickname ??= "No Nickname";
// 如果 nickname 为 null,则将其设置为 "No Nickname",否则保持不变
总结
  • ?. 用于安全地访问可能为 null 的对象的成员。
  • ?? 用于提供默认值,当左侧表达式为 null 时使用。
  • ?. 和 ?? 可以组合使用,以简化处理 null 的逻辑。
  • ??= 是 C# 8.0 引入的新特性,用于简化空合并赋值的代码。

6. 三目运算符 condition ? value_if_true : value_if_false

在 C# 中,三目运算符(也称为条件运算符)是一个简洁的语法结构,用于根据某个条件表达式来选择两个值中的一个。它的语法形式如下:

condition ? value_if_true : value_if_false
语法说明
  • condition: 这是一个布尔表达式,它必须返回 true 或 false
  • value_if_true: 如果 condition 为 true,则整个表达式的值将为 value_if_true
  • value_if_false: 如果 condition 为 false,则整个表达式的值将为 value_if_false
示例
基本用法
int a = 10;
int b = 20;
string result = a > b ? "a is greater" : "b is greater";
Console.WriteLine(result); // 输出: "b is greater"

在这个例子中,a > b 是条件表达式。如果 a 大于 b,则 result 将被赋值为 "a is greater";否则,result 将被赋值为 "b is greater"

赋值操作

三目运算符也可以用于直接赋值:

int max = (a > b) ? a : b;
Console.WriteLine(max); // 输出: 20
链式使用

你可以将多个三目运算符链式使用,以处理更复杂的条件逻辑:

int number = 5;
string message = (number > 0) ? "Positive" : (number < 0) ? "Negative" : "Zero";
Console.WriteLine(message); // 输出: "Positive"

在这个例子中,首先检查 number > 0,如果为 true 则返回 "Positive";如果为 false,则继续检查 number < 0,如果为 true 则返回 "Negative";如果两个条件都不满足,则返回 "Zero"

类型兼容性

三目运算符要求 value_if_truevalue_if_false 必须是相同类型,或者可以隐式转换为同一类型。例如:

object result = condition ? "string" : 42; // 可以工作,因为 "string" 和 42 都可以隐式转换为 object

但如果 value_if_truevalue_if_false 的类型不兼容,则会导致编译错误:

int result = condition ? "string" : 42; // 编译错误:不能将 string 隐式转换为 int
注意事项
  • 避免过度嵌套:虽然可以链式使用三目运算符,但过度嵌套可能会使代码难以阅读和维护。在这种情况下,考虑使用 if-else 语句可能更为清晰。
  • 性能考虑:三目运算符在大多数情况下与 if-else 语句的性能相当,但在某些特定场景下,if-else 语句可能会提供更好的可读性和维护性。
总结

三目运算符是 C# 中一个非常有用且简洁的工具,适用于简单的条件判断和赋值操作。合理使用它可以让你的代码更加简洁和易读。


网站公告

今日签到

点亮在社区的每一天
去签到