在 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 引入的新特性,用于简化空合并赋值的代码。
这些操作符可以帮助你编写更简洁、更安全的代码,减少 null
引用异常的发生。如果你有更多具体的问题或需要进一步的例子,请告诉我!
代码模式