如何明智地使用StringBuilder?

2024-01-10

我对使用有点困惑StringBuilder班级,第一:

A string对象串联操作总是从现有对象创建一个新对象string和新数据。 AStringBuilder对象维护一个缓冲区来容纳新数据的串联。如果有可用空间,新数据将附加到缓冲区末尾;否则,分配一个新的、更大的缓冲区,将原始缓冲区中的数据复制到新缓冲区,然后将新数据附加到新缓冲区。

但创造的意义在哪里StringBuilder实例以避免创建新的实例String?听起来像是“一换一”的交易。

static void Main(string[] args)
{
    String foo = "123";
    using (StringBuilder sb = new StringBuilder(foo)) // also sb isn't disposable, so there will be error
    {
        sb.Append("456");
        foo = sb.ToString();
    }

    Console.WriteLine(foo);
    Console.ReadKey();
}

为什么我不应该只使用

+=

Edit:好的,我现在知道如何重用一个实例StringBuilder(仍然不知道这是否符合代码标准),但这不值得仅使用一个string,不是吗?


修改不可变的 https://en.wikipedia.org/wiki/Immutable_object结构如string https://msdn.microsoft.com/en-us/library/system.string(v=vs.110).aspx必须通过复制结构来完成,这样会消耗更多内存并减慢应用程序的运行时间(也会增加GC时间等...)。

StringBuilder通过使用相同的可变对象进行操作来解决这个问题。

However:

当连接一个string在编译时如下:

string myString = "123";
myString += "234";
myString += "345";

它实际上会编译成类似的东西:

string myString = string.Concat("123", "234", "345");

这个函数比使用更快StringBuilder对于数量string输入该函数的 s 是已知的。

所以对于编译时已知的string你应该更喜欢的串联string.Concat().

至于未知数量的string就像下面的例子:

string myString = "123";
if (Console.ReadLine() == "a")
{
    myString += "234";
}
myString += "345";

现在编译器不能使用string.Concat()然而,函数StringBuilder仅当连接 6-7 或更多时,似乎在时间和内存消耗上更有效strings.

不良做法的使用:

StringBuilder myString = new StringBuilder("123");
myString.Append("234");
myString.Append("345");

精细练习用法(注意if用来):

StringBuilder myString = new StringBuilder("123");
if (Console.ReadLine() == "a")
{
    myString.Append("234");
}
myString.Append("345");

最佳实践用法(请注意while使用循环):

StringBuilder myString = new StringBuilder("123");
while (Console.ReadLine() == "a")
{
    myString.Append("234"); //Average loop times 4~ or more
}
myString.Append("345");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何明智地使用StringBuilder? 的相关文章

随机推荐