CodeGo.net> StringBuilder的:如何获得最终的字符串?

有人告诉我,用StringBuilder连接字符串更快。 我已经更改了代码,但是没有看到任何属性或方法来获取最终的构建字符串。

我如何获得字符串?

Mister Dev asked 2019-11-07T13:17:50Z
6个解决方案
111 votes

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

Patrick Desjardins answered 2019-11-07T13:18:09Z
13 votes

当您说“使用String构建器将String连接起来更快”时,仅当您反复(我重复-反复)连接到同一对象时,这才是正确的。

如果您只是连接2个字符串并立即将结果作为StringBuilder进行操作,则没有必要使用string

我偶然发现了乔恩·斯凯特(Jon Skeet)的漂亮文章:[http://www.yoda.arachsys.com/csharp/stringbuilder.html]

如果您使用的是StringBuilder,那么要获得生成的string,只需致电ToString()(毫不奇怪)。

Michael Burr answered 2019-11-07T13:18:58Z
10 votes

使用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
BlackWasp answered 2019-11-07T13:19:29Z
3 votes

我只想抛出一个不一定更快的东西,它肯定会有更好的内存占用。 这是因为字符串在.NET中是不可变的,并且每次更改字符串时都创建了一个新字符串。

smaclell answered 2019-11-07T13:19:56Z
2 votes

关于它是更快/更好的内存:

我调查了Java的这一问题,我认为.NET会如此聪明。

String的实现非常出色。

String对象跟踪“ length”和“ shared”(与保存字符串的数组的长度无关)

所以像

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

可以(通过编译器/运行时)实现为:

 - Extend the array holding "abc" by 6 additional spaces.
 - Copy def in right after abc 
 - copy ghi in after def. 
 - give a pointer to the "abc" string to a 
 - leave abc's length at 3, set a's length to 9
 - set the shared flag in both.

由于大多数字符串都是短命的,因此在许多情况下,这会使某些代码非常有效。绝对无效的情况是在循环中添加字符串或代码如下所示:

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

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

我的观点是,每次进行优化时都应该小心,除非您完全确定自己知道自己在做什么,并且绝对确定有必要,并且要进行测试以确保经过优化的代码可以通过用例,只需对其进行编码 以尽可能易读的方式,不要试图超越编译器。

在查看字符串源代码并发现编译器已经比我的用例做得更好时,我浪费了三天时间来弄乱字符串,缓存/重用字符串生成器和测试速度。 然后我不得不解释我是不是真的不知道自己在做什么,我只以为自己做了...

Bill K answered 2019-11-07T13:21:28Z
1 votes

并发连接并不快-正如smaclell指出的那样,问题在于不可改变的字符串会迫使对现有数据进行额外的分配和重新复制。

“ a” +“ b” +“ c”与字符串生成器并没有更快的关系,但是随着concat的数量变大,带有中间字符串的重复concat变得越来越快,例如:

x =“ a”; x + =“ b”; x + =“ c”; ...

Tony Lee answered 2019-11-07T13:22:09Z
translate from https://stackoverflow.com:/questions/227743/stringbuilder-how-to-get-the-final-string