C# 中的字符串创建如何避免分配?

优先使用Span和ReadOnlySpan避免字符串分配,通过stackalloc在上处理短字符串,用String.Create预分配生成字符串,减少隐式拼接,降低GC压力。

c# 中的字符串创建如何避免分配?

在 C# 中,字符串是不可变引用类型,每次修改都会创建新实例,导致内存分配。要避免不必要的字符串分配,关键在于减少临时字符串的生成,优先使用结构化方式处理文本数据。

使用 Span 和 stackalloc

对于短字符串操作,可使用 Span 在栈上分配字符数组,避免堆分配:

stackalloc 在栈上创建固定大小的字符缓冲区通过 new string(Span) 构造函数直接生成字符串(仅在必要时)适合已知长度且较小的文本处理(如格式化数字、小段拼接)

例如:

unsafe{    char* buffer = stackalloc char[256];    // 填充数据到 buffer    string result = new string(buffer, 0, length);}

使用 ReadOnlySpan 处理子串

传统 Substring() 会分配新字符串。改用 ReadOnlySpan 可以切片而不分配:

从原始字符串获取 span 切片,共享内存适用于解析、分词等中间处理阶段仅当最终需要字符串时才调用 .ToString()

示例:

string input = "hello world";ReadOnlySpan span = input.AsSpan();ReadOnlySpan word = span.Slice(0, 5); // 不分配// 后续处理可用 word 比较、查找等

使用 String.Create 预分配构造

当你必须创建新字符串但想控制分配时机,可用 String.Create

提前指定长度,避免多次扩容通过 Action 委托填充内容适用于高性能场景下的确定长度字符串生成

示例:

string result = String.Create(10, 123, (chars, value) =>{    // 直接写入 chars 指针    value.ToString().AsSpan().CopyTo(chars);});

避免隐式字符串拼接

使用 StringBuilder 仍可能产生中间分配。更优选择包括:

string.Concat(params object[]) 替代多个 + 操作(如果参数少且固定)对固定模板用 ReadOnlySpan 拼接后一次性转字符串日志等场景考虑结构化输出,延迟字符串化

基本上就这些。核心思路是:能不用字符串就先用 span,必须创建时尽量明确生命周期和大小,减少中间临时对象。配合 ref struct 和栈分配,能显著降低 GC 压力。

以上就是C# 中的字符串创建如何避免分配?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1440414.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 17:01:44
下一篇 2025年12月17日 17:01:59

相关推荐

发表回复

登录后才能评论
关注微信