# C# 语言基础
# 数组
# 索引和范围(C# 8)
索引和范围可以和 CLR 类型 Span<T> 与 ReadOnly<T > 配合使用(请参见 5.4.16 节)
自定义类型也可以通过类型定义为 Index 或 Range 的索引器来使用索引和范围(请参见 3.1.9 节)
索引
索引使用 ^ 运算符从数组的末尾来引用数组元素。^1 代表最后一个元素而 ^2 代表倒数第二个元素,一次类推(^0 等于数组的长度,因此 vowels [^0] 将会产生错误)。
# null 运算符
C# 提供了三个简化 null 处理的运算符:null 合并运算符、null 合并复制运算符和、null 条件运算符。
# null 合并运算符
null 合并运算符写作??。它的意思是 “如果左侧操作不是 null,则结果为操作数,否则结果为另一个值。” 例如:
string s1 = null; | |
string s2 = s1 ?? "nothing"; // s2 evaluates to "nothing" |
如果左侧的表达式不是 null,则右侧的表达式将不会计算。null 合并运算符同样适用于可空值类型(请参见 4.7 节)。
# null 合并赋值运算符(C# 8)
null 合并赋值运算符写作??=。它的含义是 “如果左侧操作数为 null,则将右侧的操作数赋值给左侧的操作数。” 例如:
string s1 = null; | |
s1 ??= "something"; | |
Console.WriteLine (s1); // something | |
s1 ??= "everything"; | |
Console.WriteLine (s1); // something |
# null 条件运算符
?. 运算符称为 null 条件运算符或者 Elvis 运算符(从 Elvis 表情符号而来)。改运算符可以像标准的 “." 运算符那样访问成员或调用方法。当运算符的左侧为 null 的时候,该表达式的运算结果也是 null,而不会抛出 NullReferenceException 异常。
System.Text.StringBuilder sb = null; | |
string s = sb?.ToString(); // No error; s instead evaluates to null |
上述代码的最后一行等价于:
string s = (sb == null ? null : sb.ToString()); |
当遇到 null 时,Elvis 运算符将直接略过表达式的其余部分。在下例中,即使 ToString () 和 ToUpper () 方法使用的是标准的 "." 运算符,s 的值仍然为 null。
System.Text.StringBuilder sb = null; | |
string s = sb?.ToString().ToUpper(); // s evaluates to null without error |
仅当直接的左侧运算数有可能为 null 的时候才有必要重复使用 Elvis 运算符。