哪个字符串比StringBuilder更有用?

时间:2010-06-18 12:58:25

标签: c# string stringbuilder heuristics

已经有很多关于字符串和字符串构建器之间差异的问题,大多数人都认为字符串构建器比字符串更快。我很想知道字符串构建器是否太好所以为什么字符串存在?此外,有些正文可以给我一个例子,其中字符串比字符串构建器更有用吗?

9 个答案:

答案 0 :(得分:11)

StringBuilder,顾名思义,用于构建字符串,而字符串是不可变的字符值。如果要传递字符数据,请使用字符串;如果要操作字符数据,请使用StringBuilder。

答案 1 :(得分:7)

在通过大量循环或迭代构造和修改字符串时,StringBuilder是更好的选择。

简单的字符串操作(例如几个连接或简单地存储字符串值)更适合标准字符串对象。

同样的问题? String vs. StringBuilder

答案 2 :(得分:3)

这不是一个更有用的案例......

StringString - 彼此相邻的一个或多个字符。如果您想以某种方式 更改 字符串,它只会创建更多字符串,因为它们是 immutable

StringBuilder是一个创建字符串的类。它提供了一种构造它们的方法,而不会在内存中创建大量的reduntant字符串。最终结果将始终为String

不要这样做

string s = "my string";
s += " is now a little longer";

s = s + " is now longer again";

这将在内存中创建 5 字符串(实际上,见下文)。

这样做:

StringBuilder sb = new StringBuilder();
sb.Append("my string");
sb.Append(" is now a little longer");
sb.Append(" is now longer again");
string s = sb.ToString();

这将在内存中创建 1 字符串(再次,见下文)。

你可以这样做:

string s = "It is now " + DateTime.Now + ".";

这只会在内存中创建 1 字符串。

作为旁注,创建StringBuilder确实需要一定量的内存。作为一个粗略的经验法则:

  • 如果您在循环中连接字符串,请始终使用StringBuilder
  • 如果您将字符串连接超过4次,请使用StringBuilder

答案 3 :(得分:2)

当您需要更改值时,StringBuilder会更好。否则,就没有必要了。

如果我需要在10个地方使用相同的字符串值,我将使用String。如果我需要改变它10次,StringBuilder。

答案 4 :(得分:1)

你真的会在这里使用字符串构建器吗?

Console.WriteLine("MyString");

当您需要进行大量串联来构建字符串时,StringBuilder非常棒。

Jon Skeet在这里有一个很棒的论点:http://www.yoda.arachsys.com/csharp/stringbuilder.html

查看开头的部分“所以我应该在任何地方使用StringBuilder,对吧?”

他写道:

  

这个的重要区别   例子和前一个是   我们可以轻松呈现所有字符串   需要连接在一起   在一次调用String.Concat。那   意味着没有中间字符串   需要的。 StringBuilder非常高效   第一个例子,因为它充当了一个   中间结果的容器   无需复制该结果   每次 - 什么时候没有   中间结果无论如何,它没有   优点


答案 5 :(得分:0)

StringBuilder并不比使用字符串更快,只需创建一个字符串即可。

当您必须将多个字符串连接在一起时(如in循环),StringBuilder可以更快。当您必须将字符串生成器内容转换为字符串时,您将支付性能损失。

StringBuilder对字符串的一个真正优势是你可以通过几种方法传递它并沿途添加字符串。你不能通过传递一个字符串对象来做到这一点。因此,如果您正在构建类似JSON对象的递归操作,则可以传递StringBuilder并附加值。

答案 6 :(得分:0)

字符串很好,因为它是不可变的。并且不可变的是好的,是函数式语言证明的东西。

因为如果你有一个(引用)字符串“这是一个字符串”,你可以确定它将永远具有相同的值。虽然可能会更改StringBuilder的值(通过方法调用,另一个线程等)。

但是,有时您需要原始的,纯粹的速度和内存使用优化。在这种情况下,您使用stringbuilder。

一个例子:

 var a = "This is a string";
 var b = a;
 a += ". And some part is added";   // a now references another string in memory

 var aSB = new StringBuilder("This is a string");
 var bSB = aSB
 aSB.Append(". And some part is added"); // aSB and bSB still reference the same memory spot

 Console.WriteLine(b);   // ==> This is a string
 Console.WriteLine(bSB); // ==> This is a string. And some part is added

答案 7 :(得分:0)

简而言之,这是 mutable immutable 之间的权衡

请参阅:StringBuilder vs String

答案 8 :(得分:0)

使用的分析在Concatenating Strings Efficiently提供。

基本上,(尽管阅读完整分析的链接),在非平凡的循环中连接时使用StringBuilder