编辑
2025-09-17
C#
00

目录

使用StringBuilder进行字符串拼接
示例:
应用场景:
使用String.Format或字符串插值
示例:
应用场景:
使用Span<T>进行字符串切片
示例:
应用场景:
使用StringBuilderCache减少分配
示例:
应用场景:
字符串内联
示例:
应用场景:
结论

在C#开发中,字符串操作是一个常见且重要的任务。然而,不恰当的字符串处理可能会导致性能问题。本文将探讨几种优化C#字符串性能的方法,并提供详细的代码示例和应用场景。绝大多多用StringBuilder搞定所有了。

使用StringBuilder进行字符串拼接

当需要多次拼接字符串时,使用StringBuilder比直接使用string更有效率。

示例:

C#
using System; using System.Text; class StringBuilderExample { public static void Main() { // 低效的方式 string inefficientResult = ""; for (int i = 0; i < 10000; i++) { inefficientResult += i.ToString() + " "; } // 高效的方式 StringBuilder efficientBuilder = new StringBuilder(); for (int i = 0; i < 10000; i++) { efficientBuilder.Append(i).Append(" "); } string efficientResult = efficientBuilder.ToString(); Console.WriteLine("Inefficient result length: " + inefficientResult.Length); Console.WriteLine("Efficient result length: " + efficientResult.Length); } }

image.png

应用场景:

  • 构建大型HTML或XML字符串
  • 生成报告或日志文件
  • 处理大量数据的字符串拼接

使用String.Format或字符串插值

对于简单的字符串格式化,使用String.Format或字符串插值($"")比多次使用+运算符更清晰和高效。

示例:

C#
using System; class StringFormatExample { public static void Main() { string name = "Alice"; int age = 30; // 使用String.Format string result1 = String.Format("My name is {0} and I am {1} years old.", name, age); // 使用字符串插值 string result2 = $"My name is {name} and I am {age} years old."; Console.WriteLine(result1); Console.WriteLine(result2); } }

image.png

应用场景:

  • 生成用户友好的消息
  • 构建SQL查询字符串
  • 格式化输出数据

使用Span进行字符串切片

Span<T>允许在不分配新内存的情况下操作字符串的一部分。

示例:

C#
using System; class SpanExample { public static void Main() { string text = "Hello, World! Welcome to C# programming."; // 使用Substring(会分配新内存) string substr1 = text.Substring(7, 5); // 使用Span(不会分配新内存) ReadOnlySpan<char> span = text.AsSpan(); ReadOnlySpan<char> substr2 = span.Slice(7, 5); Console.WriteLine(substr1); // 输出: World Console.WriteLine(substr2.ToString()); // 输出: World } }

image.png

应用场景:

  • 处理大型字符串的一部分
  • 解析文本文件
  • 高性能的字符串操作

使用StringBuilderCache减少分配

StringBuilderCache是一个线程静态缓存,可以减少StringBuilder的分配。

示例:

C#
using System.Text; namespace AppString { public static class StringBuilderCache { [ThreadStatic] private static StringBuilder _cachedInstance; public static StringBuilder Acquire(int capacity = 16) { StringBuilder sb = _cachedInstance; if (sb == null || capacity > sb.Capacity) { return new StringBuilder(capacity); } sb.Clear(); _cachedInstance = null; return sb; } public static void Release(StringBuilder sb) { _cachedInstance = sb; } public static string GetStringAndRelease(StringBuilder sb) { string result = sb.ToString(); Release(sb); return result; } } internal class Program { static void Main(string[] args) { for (int i = 0; i < 1000; i++) { string result = BuildString(i); Console.WriteLine(result); } } private static string BuildString(int number) { StringBuilder sb = StringBuilderCache.Acquire(); try { sb.Append("Number: "); sb.Append(number); return StringBuilderCache.GetStringAndRelease(sb); } catch { StringBuilderCache.Release(sb); throw; } } } }

image.png

应用场景:

  • 频繁创建和释放StringBuilder的场景
  • 需要重复使用StringBuilder的循环操作

字符串内联

对于频繁使用的字符串常量,可以使用字符串内联来提高性能。

示例:

C#
using System; class StringInterningExample { public static void Main() { string s1 = "Hello, World!"; string s2 = "Hello, World!"; string s3 = new string(new char[] { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!' }); Console.WriteLine(Object.ReferenceEquals(s1, s2)); // 输出: True Console.WriteLine(Object.ReferenceEquals(s1, s3)); // 输出: False // 使用String.Intern方法 string s4 = String.Intern(s3); Console.WriteLine(Object.ReferenceEquals(s1, s4)); // 输出: True } }

image.png

应用场景:

  • 处理大量重复的字符串
  • 需要频繁比较字符串的场景

结论

通过采用这些优化技术,您可以显著提高C#应用程序中字符串操作的性能。记住,性能优化应该根据具体情况来决定,并且应该通过性能测试来验证其效果。在实际应用中,请根据您的具体需求和场景选择最合适的优化方法。

希望这篇文章对您有所帮助!如果您有任何问题,请随时询问。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!