# 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 运算符。