LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#字符串处理操作之高级编程:+、StringBuilder、string.Format、string.Join

admin
2026年2月11日 9:18 本文热度 68
字符串处理在实际开发中非常高频,掌握其高级用法能显著提升代码的性能和可读性。

一、 高性能字符串拼接(避免性能陷阱)

新手常使用 + 拼接字符串,但在循环 / 高频场景下性能极差(字符串不可变,每次拼接都会创建新对象)。

1. 场景化解决方案

场景
推荐方案
性能 / 适用度
简单拼接(<5 次)
+
 运算符
简单 / 一般
循环 / 高频拼接
StringBuilder
高性能 / 最优
固定格式拼接
string.Format
/ 插值
易读 / 较好
集合元素拼接
string.Join
简洁 / 高效

2. 代码示例

​using System;using System.Text;using System.Collections.Generic;class StringHighPerformance{    static void Main()    {        // 1. StringBuilder(循环拼接首选)        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(050));        // 2. string.Join(集合拼接)        var list = new List<string> { "Apple""Banana""Orange" };        string joined = string.Join(" | ", list); // 直接拼接集合,无需循环        Console.WriteLine("Join结果:" + joined); // 输出:Apple | Banana | Orange        // 3. 插值字符串(C#6+,可读性优先)        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字符";
        // 1. 无拷贝截取(传统Substring会创建新字符串)        ReadOnlySpan<char> span = largeStr.AsSpan();        ReadOnlySpan<char> subSpan = span.Slice(46); // 从索引4开始,取6个字符        Console.WriteLine("无拷贝截取结果:" + subSpan.ToString()); // 输出:一个很长的测试
        // 2. 无拷贝判断前缀/后缀        bool startsWith = span.StartsWith("这是一个");        bool endsWith = span.EndsWith("1000字符");        Console.WriteLine($"是否以「这是一个」开头:{startsWith}"); // True        Console.WriteLine($"是否以「1000字符」结尾:{endsWith}"); // True    }}

核心优势:

  • Span<char>
     直接操作原字符串的内存(栈上安全访问),无额外内存分配;
  • 适合高频字符串切片、校验场景,能显著降低 GC 压力。

三、 复杂字符串操作(正则 / 分割 / 替换)

1. 正则表达式(Regex)高级用法

处理复杂匹配 / 替换(如提取手机号、格式化字符串)时,Regex 是核心工具,注意复用 Regex 实例提升性能。

using System;using System.Text.RegularExpressions;class StringRegex{    // 复用Regex实例(避免重复编译)    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);        }
        // 脱敏替换(保留前3后4位)        string masked = PhoneRegex.Replace(content, m => $"{m.Value.Substring(0,3)}****{m.Value.Substring(7)}");        Console.WriteLine("脱敏后内容:" + masked);        // 输出:联系电话:138****5678,备用电话:199****4321    }}

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)); // 苹果 香蕉 橙子 葡萄
        // 批量替换(StringBuilder版)        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";
        // 1. 不区分大小写比较(推荐)        bool equalIgnoreCase = string.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);        Console.WriteLine($"不区分大小写:{equalIgnoreCase}"); // True
        // 2. 忽略文化的比较(避免中文/特殊字符的文化差异)        bool equalOrdinal = string.Compare(str1, str2, StringComparison.Ordinal) == 0;        Console.WriteLine($"忽略文化比较:{equalOrdinal}"); // False
        // 3. 去除不可见字符(如空格、制表符)        string dirtyStr = "  test\t\n";        string cleanStr = dirtyStr.Trim(CharExtensions.WhitespaceChars); // 自定义去除所有空白符        Console.WriteLine($"清理后:[{cleanStr}]"); // [test]    }}// 扩展类:自定义空白符处理public static class CharExtensions{    public static readonly char[] WhitespaceChars = { ' ''\t''\n''\r''\f''\v' };}

总结

  1. 性能优先
    :循环拼接用 StringBuilder,无拷贝操作用 Span<char>,避免频繁创建字符串对象;
  2. 复用优化
    :正则表达式复用 Regex 实例(加 Compiled 选项),减少重复编译开销;
  3. 安全比较
    :字符串比较显式指定 StringComparison(优先用 Ordinal/OrdinalIgnoreCase),避免文化 / 大小写坑点。

该文章在 2026/2/11 9:24:33 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved