优先使用Span<char>和ReadOnlySpan<char>避免字符串分配,通过stackalloc在栈上处理短字符串,用String.Create预分配生成字符串,减少隐式拼接,降低GC压力。
在 C# 中,字符串是不可变引用类型,每次修改都会创建新实例,导致内存分配。要避免不必要的字符串分配,关键在于减少临时字符串的生成,优先使用结构化方式处理文本数据。
对于短字符串操作,可使用 Span<char> 在栈上分配字符数组,避免堆分配:
例如:
unsafe { char* buffer = stackalloc char[256]; // 填充数据到 buffer string result = new string(buffer, 0, length); }
传统 Substring() 会分配新字符串。改用 ReadOnlySpan<char> 可以切片而不分配:
示例:
string input = "hello world"; ReadOnlySpan<char> span = input.AsSpan(); ReadOnlySpan<char> word = span.Slice(0, 5); // 不分配 // 后续处理可用 word 比较、查找等
当你必须创建新字符串但想控制分配时机,可用 String.Create:
示例:
string result = String.Create(10, 123, (chars, value) => { // 直接写入 chars 指针 value.ToString().AsSpan().CopyTo(chars); });
使用 StringBuilder 仍可能产生中间分配。更优选择包括:
基本上就这些。核心思路是:能不用字符串就先用 span,必须创建时尽量明确生命周期和大小,减少中间临时对象。配合 ref struct 和栈分配,能显著降低 GC 压力。
以上就是C# 中的字符串创建如何避免分配?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号