C#面试题更新 2026-08-03

请解释 C# 中的 Index 和 Range 结构体是什么,并说明在集合操作中应如何使用它们。

考察说明

考查对 C# 8.0 中 Index 与 Range 结构体的理解及在集合切片与索引访问中的实际应用。

回答思路

  1. 【回答框架 1】Index 表示从集合末尾计数的索引,构造方式为 ^n,其中 ^1 代表最后一个元素,^0 代表集合长度本身(越界)。Range 表示一个区间,由两个 Index 组成,语法为 start..end,其中 end 为排除边界,支持 ..^1 等组合。
  2. 【回答框架 2】在集合中使用时,Index 可直接用于数组、List、Span 等支持索引器的类型,例如 arr[^1] 取最后一个元素,arr[^2] 取倒数第二个。Range 通过 arr[start..end] 生成切片,例如 arr[1..^1] 去掉首尾,arr[..] 返回完整副本或视图,具体取决于集合类型。
  3. 【回答框架 3】编译器会将 Index 和 Range 语法转换为底层调用:对数组使用 Array.GetValue 或直接索引,对 List 使用 Slice 方法(若可用),对 Span 使用 Slice。对于不实现 Range 索引器的类型,可将 Range 的 Start 和 End 属性转为显式范围计算后使用。
  4. 【回答框架 4】使用时需注意边界条件:Range 的 end 是排除的,因此 arr[^1..] 表示取最后一个元素到结尾,而 arr[..^0] 会因 ^0 表示长度而得到整个集合。对于可变集合,切片可能返回新数组或引用原集合,需明确预期。
  5. 【关键点 1】Index 使用 ^ 运算符表示从末尾计数,^1 为最后元素,^0 表示长度(越界),只能用于支持索引器的类型。
  6. 【关键点 2】Range 使用 .. 运算符定义闭开区间,start 包含、end 排除,例如 arr[1..^1] 去掉首尾。
  7. 【关键点 3】编译器将 Range 语法转换为对 Slice 方法的调用,但要求类型实现相应接口或具备索引器,否则需手动转换。
  8. 【易错点 1】混淆 Range 的排除边界,导致切片结果比预期少一个元素。
  9. 【易错点 2】对非支持类型错误使用 Index 或 Range,如未实现相应索引器的自定义类型,需手动处理。
  10. 【易错点 3】在可变集合中切片可能返回视图而非副本,修改会影响原集合,需根据容器类型判断。