StringBuilder:如何获得最终的string?

有人告诉我用StringBuilder连接string会更快。 我已经改变了我的代码,但我没有看到任何属性或方法来获得最终的生成string。

我怎样才能得到string?

您可以使用.ToString()StringBuilder获取String

当你说“把String和String构build器连接起来更快”的时候,只有当你连续地重复地 )连接到同一个对象时,这才是真实的。

如果你只是串联2个string,并以结果的forms立即作为一个string ,使用StringBuilder是没有意义的。

我只是偶然发现了Jon Skeet写的这个: http : //www.yoda.arachsys.com/csharp/stringbuilder.html

如果你正在使用StringBuilder ,那么得到结果string ,这只是一个调用ToString() (不出意外)的问题。

使用StringBuilder完成处理后,使用ToString方法返回最终结果。

来自MSDN:

 using System; using System.Text; public sealed class App { static void Main() { // Create a StringBuilder that expects to hold 50 characters. // Initialize the StringBuilder with "ABC". StringBuilder sb = new StringBuilder("ABC", 50); // Append three characters (D, E, and F) to the end of the StringBuilder. sb.Append(new char[] { 'D', 'E', 'F' }); // Append a format string to the end of the StringBuilder. sb.AppendFormat("GHI{0}{1}", 'J', 'k'); // Display the number of characters in the StringBuilder and its string. Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); // Insert a string at the beginning of the StringBuilder. sb.Insert(0, "Alphabet: "); // Replace all lowercase k's with uppercase K's. sb.Replace('k', 'K'); // Display the number of characters in the StringBuilder and its string. Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString()); } } // This code produces the following output. // // 11 chars: ABCDEFGHIJk // 21 chars: Alphabet: ABCDEFGHIJK 

我只想甩出来可能不一定更快,那肯定会有更好的内存占用。 这是因为string在.NET中是不可变的,每次你改变一个string,你都创build了一个新string。

连接速度并不快 – 正如smaclell指出的那样,问题是不可变的string强制对现有数据进行额外的分配和重新复制。

“a”+“b”+“c”与string生成器没有更快的关系,但是当中间string变大时,重复的连接string会变得越来越快。

x =“a”; X + = “B”; X + = “C”; …

关于它更快/更好的记忆:

我用Java来研究这个问题,我认为.NET将会如此聪明。

String的实现非常令人印象深刻。

String对象跟踪“length”和“shared”(独立于包含string的数组的长度)

所以像

 String a = "abc" + "def" + "ghi"; 

可以通过编译器/运行库来实现:

  - 将“abc”数组扩展6个空格。
  - 在abc后面右键复制def 
  - 在def后复制ghi。 
 给一个指向“abc”string的指针 
  - 把abc的长度设置为3,长度设置为9
  - 在两个设置共享标志。

由于大多数string都是短命的,所以在很多情况下这会产生一些非常高效的代码。 在绝对没有效率的情况下,当你在一个循环内添加一个string,或者当你的代码是这样的:

 a = "abc"; a = a + "def"; a += "ghi"; 

在这种情况下,使用StringBuilder构造会更好。

我的观点是,每当你进行优化时,你应该小心,除非你绝对确信你知道你在做什么,而且你绝对确定它是必要的,而且你testing以确保优化后的代码能够通过一个用例,只需编码以最可读的方式,不要试图想出编译器。

在我查看string源代码之前,我浪费了3天的时间来处理string,caching/重用string构build器和testing速度,并发现编译器已经做得比我的用例更好了。 然后我不得不解释我怎么不知道我在做什么,我只以为我做了…