C#怎么使用ArraySegment和切片 C#如何用Range和Index对数组和字符串进行切片操作【语法】
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是一款自动视频编辑工具可以将文本、文章或故事转换为视频。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2505044.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!