string与StringBuilder的区别 string对象是不可变的包括长度或者其中的任何字符都是不可以改变的 string @string = a; @string = @string + b; 以上代码让人误以为@string是能够增加长度的其实第二句代码是重新创建了一个新的对象而第一个对象被丢弃它将成为垃圾收集器收集的对象 C#中不能使用new string()来构造一个string对象假如可以以上代码相当于 string @string = new string(a); @string = new string(a+b); StringBuilder是可变的它是专门用于对字符串和字符执行动态操作的类 用StringBuilder实现: StringBuilder stringBuilder = new StringBuilder(a); stringBuilderAppend(b); StringBuilder在内部有一个足够长的字符数组用于存放字符串对象当字符串长度没超过字符数组长度时所有操作都是针对同一个字符数组当长度超过时StringBuilder将自动创建一个更长的数组把原来的数据复制到新数组中 字符串操作性能比较 让string和StringBuilder执行相同的操作:循环追加一个字符串a public static void CompareString() { UseString(); UseStringBuilder(); } private static void UseString() { string @string = ; DateTime startTime = DateTimeNow; for (int i = ; i < ; i++) { @string += a; } DateTime endTime = DateTimeNow; TimeSpan timeSpan = endTime startTime; ConsoleWriteLine(timeSpanToString()); } private static void UseStringBuilder() { StringBuilder stringBuilder = new StringBuilder(); DateTime startTime = DateTimeNow; for (int i = ; i < ; i++) { stringBuilderAppend(a); } DateTime endTime = DateTimeNow; TimeSpan timeSpan = endTime startTime; ConsoleWriteLine(timeSpanToString()); } 运行CompareString()函数得到以下结果 运行次数时间string万次秒StringBuilder一百万次秒 结论使用StringBuilder对字符串动态追加的速度是string的倍左右 补充针对不同的字符串长度和不同的操作比如Remove性能表现会各不一样需要一个一个测试 |