字符串处理在实际开发中非常高频,掌握其高级用法能显著提升代码的性能和可读性。一、 高性能字符串拼接(避免性能陷阱)
新手常使用 + 拼接字符串,但在循环 / 高频场景下性能极差(字符串不可变,每次拼接都会创建新对象)。
1. 场景化解决方案
| | |
|---|
| + | |
| StringBuilder | |
| string.Format | |
| string.Join | |
2. 代码示例
using System;using System.Text;using System.Collections.Generic;class StringHighPerformance{ static void Main() { var sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.Append($"Item {i}, "); } string result = sb.ToString(); Console.WriteLine("StringBuilder结果(前50字符):" + result.Substring(0, 50)); var list = new List<string> { "Apple", "Banana", "Orange" }; string joined = string.Join(" | ", list); Console.WriteLine("Join结果:" + joined); string name = "张三"; int age = 25; string info = $"姓名:{name},年龄:{age}"; Console.WriteLine("插值结果:" + info); }}
关键说明:
- StringBuilder 核心优势:内部维护字符数组,仅在容量不足时扩容,避免频繁创建字符串对象。
- 初始化建议:已知大致长度时,指定初始容量(如 new StringBuilder(1000)),减少扩容次数。
二、 字符串内存优化(Span<T>/Memory<T>)
.NET Core 2.1+ 引入的 Span<char>/ReadOnlySpan<char> 可以避免字符串的不必要拷贝,尤其适合处理大字符串 / 高频操作。
代码示例:无拷贝截取 / 操作
using System;class StringMemoryOpt{ static void Main() { string largeStr = "这是一个很长的测试字符串,长度可能超过1000字符";
ReadOnlySpan<char> span = largeStr.AsSpan(); ReadOnlySpan<char> subSpan = span.Slice(4, 6); Console.WriteLine("无拷贝截取结果:" + subSpan.ToString());
bool startsWith = span.StartsWith("这是一个"); bool endsWith = span.EndsWith("1000字符"); Console.WriteLine($"是否以「这是一个」开头:{startsWith}"); Console.WriteLine($"是否以「1000字符」结尾:{endsWith}"); }}
核心优势:
- Span<char> 直接操作原字符串的内存(栈上安全访问),无额外内存分配;
- 适合高频字符串切片、校验场景,能显著降低 GC 压力。
三、 复杂字符串操作(正则 / 分割 / 替换)
1. 正则表达式(Regex)高级用法
处理复杂匹配 / 替换(如提取手机号、格式化字符串)时,Regex 是核心工具,注意复用 Regex 实例提升性能。
using System;using System.Text.RegularExpressions;class StringRegex{ private static readonly Regex PhoneRegex = new Regex(@"1[3-9]\d{9}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
static void Main() { string content = "联系电话:13812345678,备用电话:19987654321";
MatchCollection matches = PhoneRegex.Matches(content); foreach (Match match in matches) { Console.WriteLine("提取的手机号:" + match.Value); }
string masked = PhoneRegex.Replace(content, m => $"{m.Value.Substring(0,3)}****{m.Value.Substring(7)}"); Console.WriteLine("脱敏后内容:" + masked); }}
2. 高级分割 / 替换
- Split
- Replace:支持自定义替换逻辑(StringBuilder.Replace 性能更优)。
using System;class StringSplitReplace{ static void Main() { string str = "苹果,香蕉;橙子|葡萄"; string[] fruits = str.Split(new[] { ',', ';', '|' }, StringSplitOptions.RemoveEmptyEntries); Console.WriteLine("分割结果:" + string.Join(" ", fruits));
var sb = new StringBuilder("今天天气很好,适合去公园玩,公园人不多"); sb.Replace("公园", "植物园").Replace("很好", "极佳"); Console.WriteLine("批量替换结果:" + sb.ToString()); }}
四、 字符串比较 / 本地化(避免坑点)
C# 字符串比较默认区分大小写 / 文化,高级场景需显式指定规则:
using System;using System.Globalization;class StringCompare{ static void Main() { string str1 = "Hello"; string str2 = "hello";
bool equalIgnoreCase = string.Equals(str1, str2, StringComparison.OrdinalIgnoreCase); Console.WriteLine($"不区分大小写:{equalIgnoreCase}");
bool equalOrdinal = string.Compare(str1, str2, StringComparison.Ordinal) == 0; Console.WriteLine($"忽略文化比较:{equalOrdinal}");
string dirtyStr = " test\t\n"; string cleanStr = dirtyStr.Trim(CharExtensions.WhitespaceChars); Console.WriteLine($"清理后:[{cleanStr}]"); }}public static class CharExtensions{ public static readonly char[] WhitespaceChars = { ' ', '\t', '\n', '\r', '\f', '\v' };}
总结
- 性能优先:循环拼接用 StringBuilder,无拷贝操作用 Span<char>,避免频繁创建字符串对象;
- 复用优化:正则表达式复用 Regex 实例(加 Compiled 选项),减少重复编译开销;
- 安全比较:字符串比较显式指定 StringComparison(优先用 Ordinal/OrdinalIgnoreCase),避免文化 / 大小写坑点。
该文章在 2026/2/11 9:24:33 编辑过