为何ReadOnlySpan<T>未提供接受Range实例的Slice(...)重载?
简化ReadOnlySpan结合Range的切片操作
你没遗漏什么,只是不知道.NET已经提供了更简洁的写法——直接用Range作为ReadOnlySpanGetOffsetAndLength再调用Slice。
优化后的代码
// 生成源Span var myInput = "ab,cd,ef".AsSpan(); // 分配存储拆分结果的Range数组 Span<Range> splitRanges = stackalloc Range[3]; // 按逗号拆分,获取实际拆分出的数量 int splitCount = myInput.Split(splitRanges, ','); // 直接用Range索引器获取切片,一步到位 if (splitCount > 0) { var firstSpan = myInput[splitRanges[0]]; }
为什么没有Slice(Range)重载?
.NET的设计里,Range类型是和索引器绑定实现范围访问的,这是框架的惯用设计(比如数组、List<T>也支持myArray[1..3]这类Range语法)。ReadOnlySpan<T>的索引器已经原生支持Range参数,所以不需要额外给Slice添加Range重载——本质上mySpan[range]就是框架提供的“Range版Slice”。
额外提示
调用Split时一定要关注它的返回值(实际拆分出的有效Range数量),避免访问超出范围的无效元素,上面代码里的splitCount判断就是必要的安全处理。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

