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

C# 是否存在对应 C++17 string_view 的等价类型以避免字符串拷贝?

C# 中对应 C++17 std::string_view 的无拷贝字符串访问实现

你提到的传统字符串操作会拷贝处理后剩余内容的问题,本质是C# string 作为不可变托管类型的固有特性:所有子串截取、分割操作都会触发新的内存分配,把目标字符段拷贝到新的内存块中。C# 中存在和C++17 std::string_view 设计目标、核心逻辑完全对齐的等价实现,可从根本上规避这类不必要的拷贝开销。

核心等价类型:ReadOnlySpan<char>

这是 .NET Core 2.1 开始引入的托管值类型,实现逻辑和C++ std::string_view 几乎完全对应:

  • 内部仅存储两个核心值:指向底层字符数据内存位置的指针、以及可访问的字符序列长度,不持有字符数据的所有权,所有访问操作都是只读的,完全不会触发额外的内存拷贝。
  • 子片段截取操作零成本:需要获取当前序列的某段子串时,仅需调整内部指针的偏移量、更新对应的长度参数即可,不会像传统string.Substring()方法那样把截取的内容拷贝到新的内存块。
  • 传参成本极低:作为值类型可以直接按值传递,跨方法调用时的内存开销仅相当于传递两个基础整数值,没有堆对象分配的额外成本。
  • 适配能力和string_view定位一致:不需要依赖源数据的所有权类型——不管是不可变托管string、栈上分配的字符数组、非托管内存块中的字符序列,都可以直接创建对应的ReadOnlySpan<char>实例,不需要做类型转换或数据拷贝,完全可以替代传统的string作为通用字符序列方法参数的适配作用。

配套场景与使用提示

  • 如果需要跨异步上下文传递、或者需要更长生命周期持有只读字符序列,因为ReadOnlySpan<char>作为栈引用类型无法跨await边界使用,可选用同设计思路的ReadOnlyMemory<char>。它同样不会拷贝底层字符数据,仅持有对源数据的句柄加偏移、长度信息,满足跨上下文传递的需求。
  • 目前 .NET 基础类库已经完成了对这两个类型的全面适配,字符串解析、格式化、正则匹配、内存操作等高频API都提供了直接接收ReadOnlySpan<char>的重载,端到端链路都可以做到无冗余拷贝。
  • 生命周期约束和C++ string_view 完全一致:ReadOnlySpan<char>本身不持有数据所有权,必须保证它指向的底层字符数据在使用Span的全过程中不会被回收、也不会被修改,否则会触发非法内存访问。

内容的提问来源于stack exchange,提问作者LinguistTroubadour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 14:15:05