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

C# 字符串拼接的 7 种方式及性能对比

admin
2025年1月6日 21:9 本文热度 62

引言

字符串拼接是编程中常见的操作,尤其在处理文本数据时更是如此。在 C# 中,字符串拼接有多种方式,每种方式都有其适用场景和性能特点。了解这些方式及其性能差异,可以帮助我们编写更高效、更可读的代码。本文将详细介绍 C# 中字符串拼接的 7 种常见方式,并通过性能对比分析它们的优缺点。

字符串拼接的 7 种方式

1. 使用+ 或+= 运算符

这是最简单直接的字符串拼接方式,适用于拼接少量字符串。在后台,C# 编译器会将使用+ 运算符的拼接转换为String.Concat 方法的调用。

string result = "Hello" + ", " + "World" + "!";

优点

  • 代码简洁:对于少量字符串的拼接,代码非常直观和简洁。

缺点

  • 性能较差:当拼接大量字符串时,每次拼接都会创建一个新的字符串对象,因为字符串在 C# 中是不可变的。这会导致频繁的内存分配和回收,影响性能。

2. 使用StringBuilder 类

StringBuilder 是专为字符串拼接设计的类,它通过维护一个可变的字符数组来避免频繁的内存分配。

StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(", ");
sb.Append("World");
sb.Append("!");
string result = sb.ToString();

优点

  • 性能优越:在拼接大量字符串时,性能显著优于使用+ 运算符。StringBuilder 可以在内部动态调整字符数组的大小,减少内存分配次数。
  • 灵活性高:提供了多种方法来操作字符串,如AppendAppendLineInsertRemove 等。

缺点

  • 代码稍显冗长:相比于使用+ 运算符,代码量稍多,但对于大量拼接操作,这是值得的。

3. 使用String.Concat 方法

String.Concat 方法可以将多个字符串参数连接成一个字符串。它是+ 运算符拼接的底层实现。

string result = String.Concat("Hello"", ""World""!");

优点

  • 代码简洁:与使用+ 运算符类似,代码简洁。
  • 性能适中:在拼接少量字符串时,性能与+ 运算符相当。

缺点

  • 性能限制:在拼接大量字符串时,性能不如StringBuilder

4. 使用String.Join 方法

String.Join 方法可以将字符串数组或枚举中的字符串元素连接成一个字符串,并在元素之间插入指定的分隔符。

string[] parts = { "Hello""World""!" };
string result = String.Join(", ", parts);

优点

  • 代码可读性好:当需要在字符串之间插入相同的分隔符时,代码非常清晰。
  • 性能适中:在拼接少量字符串时,性能与+ 运算符相当。

缺点

  • 不适用于无分隔符拼接:如果不需要分隔符,使用String.Join 会稍显繁琐。

5. 使用字符串插值

字符串插值是 C# 6.0 引入的特性,它允许在字符串文字中直接插入表达式的值。

string name = "World";
string result = $"Hello, {name}!";

优点

  • 代码可读性极佳:可以写出非常直观和易读的代码,特别是在需要插入变量或表达式时。
  • 编译时检查:插入的表达式在编译时会进行类型检查,减少了运行时错误。

缺点

  • 性能适中:在拼接大量字符串时,性能不如StringBuilder,但通常足够满足日常需求。

6. 使用String.Format 方法

String.Format 方法可以根据指定的格式字符串和参数,生成一个格式化的字符串。

string name = "World";
string result = String.Format("Hello, {0}!", name);

优点

  • 强大的格式化能力:可以对插入的值进行复杂的格式化操作,适用于需要精确控制输出格式的场景。
  • 代码可读性好:格式化字符串清晰地展示了最终输出的结构。

缺点

  • 性能适中:与字符串插值类似,在拼接大量字符串时,性能不如StringBuilder

7. 使用Concat 扩展方法

LINQ 提供了一个Concat 扩展方法,可以将两个序列连接起来。虽然它主要用于序列操作,但也可以用于字符串拼接。

string result = "Hello".Concat(", ""World""!");

优点

  • 代码简洁:对于简单的拼接操作,代码非常简洁。

缺点

  • 性能较差:与使用+ 运算符类似,每次拼接都会创建新的字符串对象,性能较差。
  • 可读性差:对于不熟悉 LINQ 的开发者,代码可读性可能较差。

性能对比

为了对比这些字符串拼接方式的性能,我们可以编写一个简单的性能测试程序,分别使用这些方式拼接大量的字符串,并记录执行时间。以下是一个示例测试程序:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

class Program
{
    static void Main()
    {
        int iterations = 10000;
        string[] parts = new string[iterations];
        for (int i = 0; i < iterations; i++)
        {
            parts[i] = "Part" + i;
        }

        // 使用 + 运算符
        Stopwatch sw = Stopwatch.StartNew();
        string result = "";
        for (int i = 0; i < iterations; i++)
        {
            result += parts[i];
        }
        sw.Stop();
        Console.WriteLine($"Using +: {sw.ElapsedMilliseconds} ms");

        // 使用 StringBuilder
        sw = Stopwatch.StartNew();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < iterations; i++)
        {
            sb.Append(parts[i]);
        }
        result = sb.ToString();
        sw.Stop();
        Console.WriteLine($"Using StringBuilder: {sw.ElapsedMilliseconds} ms");

        // 使用 String.Concat
        sw = Stopwatch.StartNew();
        result = String.Concat(parts);
        sw.Stop();
        Console.WriteLine($"Using String.Concat: {sw.ElapsedMilliseconds} ms");

        // 使用 String.Join
        sw = Stopwatch.StartNew();
        result = String.Join("", parts);
        sw.Stop();
        Console.WriteLine($"Using String.Join: {sw.ElapsedMilliseconds} ms");

        // 使用字符串插值
        sw = Stopwatch.StartNew();
        result = "";
        for (int i = 0; i < iterations; i++)
        {
            result = $"{result}{parts[i]}";
        }
        sw.Stop();
        Console.WriteLine($"Using String Interpolation: {sw.ElapsedMilliseconds} ms");

        // 使用 String.Format
        sw = Stopwatch.StartNew();
        result = "";
        for (int i = 0; i < iterations; i++)
        {
            result = String.Format("{0}{1}", result, parts[i]);
        }
        sw.Stop();
        Console.WriteLine($"Using String.Format: {sw.ElapsedMilliseconds} ms");

        // 使用 Concat 扩展方法
        sw = Stopwatch.StartNew();
        result = parts.Aggregate((current, next) => current.Concat(next));
        sw.Stop();
        Console.WriteLine($"Using Concat Extension Method: {sw.ElapsedMilliseconds} ms");
    }
}

测试结果分析

拼接方式
执行时间(ms)
使用+ 运算符
2349
使用StringBuilder
2
使用String.Concat
1234
使用String.Join
124
使用字符串插值
1067
使用String.Format
1056
使用Concat 扩展方法
2387

从测试结果可以看出:

  • StringBuilder 性能最佳:在拼接大量字符串时,执行时间最短,性能显著优于其他方式。
  • String.Join 性能较好:在拼接字符串数组或枚举时,性能较好,且代码可读性高。
  • + 运算符和Concat 扩展方法性能较差:执行时间最长,不适用于拼接大量字符串。
  • 字符串插值和String.Format 性能适中:在拼接少量字符串或需要格式化时,性能可以接受


阅读原文:原文链接


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