一、C#字符串连接方式
C#有多种连接字符串的方式,如下所示:
1. +
例如,
string s1 = "123", s2 = "abc";
string s3 = s1 + s2; //s3为"123abc"
2. $
例如,
string s4 = "456", s5 = "def";
string s6 = $"{s4}{s5}" ; //s6为"456def"
3. StringBuilder
例如,
string s7 = "789", s8 = "ghi";
StringBuilder b1 = new StringBuilder();
b1.Append(s7);
b1.Append(s8);
string s9 = b1.ToString(); //s9为"789ghi"
4. 其他的方法,如string.Concat、string.Format等等,因为使用起来略显不便,就不再提了。
在上述方法中,比较常见的是前3种。
“+”的方法,操作简单直观,敲键盘次数少,在字符串个数较少、操作频率低的时候,可以优先选用。由于字符串是不可变的,所以在具体执行连接时,编译器会生成一些临时字符串,从而降低效率。另外,“+”操作符的两边都必须是字符串,而不能有整数或其他类型的数据,所以如果要连接一个整数和一个字符串,恐怕敲键盘的次数就要多一些,例如:string s = 123.ToString() + "abc"。
“$”的方法,操作简单直观,敲键盘次数少,在字符串个数较少、操作频率低的时候,可以优先选用。与“+”类似,在具体执行连接时,编译器会生成一些临时字符串,从而降低效率。与“+”不同的是,"$"可以连接不同的数据类型,例如:
int a = 123; double f = 456;string s10="abc";
string s11 = $"{a}+{f}很方便吧{s10}"; //s11为"123+456很方便吧abc"
由于这种特性,使得"$"操作方法深受程序员的喜爱。不过,这种便捷性牺牲了部分性能,编译器在背后需要做一些类型转换操作。
StringBuilder的内部字符串是可变的,当容纳不下的时候,它会扩大容量,因此在字符串比较多、操作频繁、性能要求比较高的时候,可以考虑这种方法。不过,相比“+”、"$"操作方法,StringBuilder需要较多的敲键盘次数。
二、“+”、"$"和StringBuilder三种方法比较
从操作时间和对内存的使用情况,对三种方法进行比较。计算时间时,可以使用System.Diagnostics中的Stopwatch进行计时。计算内存时,则可以使用System.Diagnostics中的性能组件PerformanceCounter。详情可参考代码。
操作步骤为:1)给出一段文本和循环次数;2)调用GC.Collect()进行垃圾回收;3)统计期初内存使用情况;4)使用某种连接方法进行连接;5)统计期末内存使用情况;6)计算差值。
比较结果:
由上面的截图可以看出,对字符串“查找所有应用程序标题”连接50000次,“+”所用时间为12秒、所用内存为12MB,"$"方法所用时间为25秒、所用内存为7MB,StringBuilder方法所用时间为4毫秒,所用内存为1MB,可见,从时间上来看,“$”方法最差,StringBuilder最好,二者相差6000倍;从内存上看,"+"方法最差,StringBuilder方法最好,二者相差12倍。
结论:在字符串较小、使用频率很低的场合,使用“+”或"$"都行,如果连接的数据类型都是字符串,则推荐用"+",如果有多种类型,则推荐用"$";在字符串连接频繁的场合,例如循环内部连接字符串,则推荐使用StringBuilder。
文章和代码完全原创,错误之处在所难免,请指正。可以去本人的贡献资源里下载代码。