哪个字符串比StringBuilder更有用?

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

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

String是一个String – 彼此相邻的一个或多个字符。 如果你想在某种程度上改变一个字符串,它只会创建更多的字符串,因为它们是不可变的

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

正如其名称所示,StringBuilder用于构建字符串,而字符串是不可变的字符值。 如果要传递字符数据,请使用字符串;如果要操作字符数据,请使用StringBuilder。

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

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

类似的问题? String vs. StringBuilder

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

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

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

 Console.WriteLine("MyString"); 

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

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

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

他写:

这个例子与前一个例子的重要区别在于我们可以在一次调用String.Concat时轻松地呈现需要连接在一起的所有字符串。 这意味着不需要中间字符串。 StringBuilder在第一个例子中是高效的,因为它充当中间结果的容器而不必每次都复制该结果 – 当没有中间结果时,它没有任何优势。


简而言之,它是可变不可变之间的权衡

请参阅: StringBuilder与String

StringBuilder并不比使用字符串快,只是创建一个字符串。

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

StringBuilder优于字符串的一个真正优点是,您可以通过多种方法传递它并沿途追加字符串。 你不能通过传递一个字符串对象来做到这一点。 因此,如果您有一个递归操作,您正在构建像JSON对象或其他东西,您可以传递StringBuilder并附加值。

字符串很好,因为它是不可变的。 并且不可变的是好的,是function语言被certificate的东西。

因为如果你有一个(引用)字符串“这是一个字符串”,你可以确定它将永远具有相同的值。 虽然可以更改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 

使用的分析提供在: 有效连接字符串 。

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