C# 中?、?. 、 ??
在 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_true 和 value_if_false 必须是相同类型,大概可以隐式转换为同一类型。比方:
object result = condition ? "string" : 42; // 可以工作,因为 "string" 和 42 都可以隐式转换为 object 但如果 value_if_true 和 value_if_false 的类型不兼容,则会导致编译错误:
int result = condition ? "string" : 42; // 编译错误:不能将 string 隐式转换为 int 注意事项
[*]避免过度嵌套:虽然可以链式使用三目运算符,但过度嵌套大概会使代码难以阅读和维护。在这种情况下,考虑使用 if-else 语句大概更为清楚。
[*]性能考虑:三目运算符在大多数情况下与 if-else 语句的性能相当,但在某些特定场景下,if-else 语句大概会提供更好的可读性和维护性。
总结
三目运算符是 C# 中一个非常有用且简洁的工具,实用于简单的条件判断和赋值操纵。合理使用它可以让你的代码更加简洁和易读。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]