资讯动态

C#怎么使用ArraySegment和切片 C#如何用Range和Index对数组和字符串进行切片操作【语法】

发布时间:2026/9/26 9:30:28 来源:尧图企业网站定制
pArraySegment 是仅记录起始位置和长度的数组视图不复制数据、无内存安全检查越界不抛异常Range/ Index 是 C# 8.0 语法糖依赖类型实现对应索引器字符串切片需防代理对越界。/pArraySegment 不是切片只是“视图”它不复制数据也不改变原数组只记录起始位置和长度。很多人误以为它能像 Spant/t 那样安全地做局部操作但 ArraySegmentt/t 没有内存安全检查越界访问不会抛异常而是读到脏数据或崩溃。只适合传给老 API比如 Socket.SendAsync(ArraySegmentbyte)/byte新代码优先用 Spant/t 或 Memoryt/tArraySegmentt.Array/t 可能为 null比如构造时传了 null 数组用前必须判空不能直接用 [i] 索引访问 —— 要手动加 Offset比如 seg.Array[seg.Offset i]没有 Length 属性以外的长度相关方法也不支持 foreach除非显式转成 IEnumerablet/tRange 和 Index 是语法糖底层靠编译器重写它们本身不是类型只是 C# 8.0 引入的语法编译后变成 Range 或 Index 类型的实例再由目标类型的 get_Slice 或 get_Item 方法处理。所以不是所有类型都支持 —— 只有实现了对应索引器的类型才行。数组、string、Spant/t、ReadOnlySpant/t 原生支持Listt/t 不支持会编译失败^n 表示从末尾往前数第 n 个^1 是最后一个但 ^0 是非法的运行时报 IndexOutOfRangeException.. 左右都可以省略[..3] 等价于 [0..3][3..] 等价于 [3..Length]负索引在运行时才计算真实位置所以 arr[^i] 比 arr[arr.Length - i] 多一次判断开销微小但高频场景可感知字符串切片要注意编码边界string 是 UTF-16 编码一个 Unicode 字符可能占两个 char即代理对。用 Range 切片时如果切在代理对中间会得到无效的 char 序列ToString() 可能显示 甚至后续 Spanchar.Utf8Bytes/char 转换出错。 Tellers AI Tellers是一款自动视频编辑工具可以将文本、文章或故事转换为视频。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑