You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ReadOnlySpan<T>未提供接受Range实例的Slice(...)重载?

简化ReadOnlySpan结合Range的切片操作

你没遗漏什么,只是不知道.NET已经提供了更简洁的写法——直接用Range作为ReadOnlySpan的索引器参数,不需要手动调用GetOffsetAndLength再调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:12:18