C#中的字符拼接技巧

谈一谈字符串的拼接

字符串是我们编程中最常使用的引用类型。String它是一个sealed类,存储在内存堆当中,每次更改将会产生一个新的string来存储,原来的就会被回收。

字符串拼接操作有多种方法,都能达到我们想要的拼接效果。但是它们的还是存在一定的差异,特别是性能方面。

1、使用"+"来拼接

string str ="Hello";//分配一块内存存储Hello

str = str +" my friend!";//重新分配一块内存来存储 Hello my friend!

此方法可以看出拼接都会产生两次内存地址,随着拼接字符串的个数地址,分配内存地址的次数也递增,当几个简单的字符串通过该方式拼接时,其实我们还是感觉不到性能的影响,但是当字符串数量大时,你都会有感觉了,那样不仅仅造成内存的浪费,还直接影响性能。

string str1 = "Hello";//分配一块内存存储Hello

string str2 = "my friend!";//分配一块内存存储my friend!

string str3 = str1 + str3;//分配一块内存存储Hello my friend!

以上代码可以看出来 会产生 3个对象,这种方法消耗的内存更多。

对于少量的字符串拼接 "+" 还比较直观方便而且不会产生性能问题。但是大量拼接就不能使用。

2、使用StringBuilder来拼接

StringBuilder其实内部相当于是维护的一个字符数组,是一个可以动态增加自身数据长度,其默认长度为16,当存储的字符串超出其长度是,会自动扩容2倍长度。

可以看出来自动扩容是会损耗性能的,建议初始化时对其进行大小估计。

StringBuilder str = new StringBuilder(2);

str.Append("Hello");

str.Append(" my friend!");

string result = str.ToString();

3、使用String.Format来拼接

其底层本质还是StringBuilder来实现。

public static String Format(IFormatProvider provider, String format, params Object[] args)
{

    if (format == null || args == null)

      throw new ArgumentNullException((format==null)?"format":"args");

    StringBuilder sb = new StringBuilder(format.Length + args.Length * 8);

    sb.AppendFormat(provider,format,args);

    return sb.ToString();

}

4、使用$进行拼接

"$"是在C#6.0出现的一个新特性,其作用相当于对String.Format()的简化,在使用String.Format来拼接时多起来的时候会眼花缭乱,$很好地解决这个痛点,让代码更加直观。

string str = "Hello";
str = $"{str} my friend!";

在性能方面 我们对比 “+” 和StringBuilder会发现 在少量字符串拼接是没有差异的。

在大量字符串拼接的时候StringBuilder的优势就很明显了。

在编程过程中要注意我们的代码对性能的影响。

 

posted @ 2022-12-01 11:27  kenneth_kung  阅读(1617)  评论(0编辑  收藏  举报