5

关于字符串和字符串生成器之间的区别已经提出了很多问题,并且大多数人认为字符串生成器比字符串更快。我很想知道字符串生成器是否太好了,那么为什么会有字符串呢?此外,有人可以给我一个例子,字符串比字符串生成器更有用吗?

4

9 回答 9

11

顾名思义,StringBuilder 用于构建字符串,而字符串是不可变的字符值。当你想要传递字符数据时使用字符串,当你想要操作字符数据时使用 StringBuilder。

于 2010-06-18T13:03:26.543 回答
7

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

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

类似的问题?字符串与 StringBuilder

于 2010-06-18T13:02:34.673 回答
3

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

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

AStringBuilder是一个创建字符串的类。它提供了一种构建它们的方法,而无需在内存中创建大量冗余字符串。最终结果将始终是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无论如何创建 a 确实需要一定数量的内存。作为一个粗略的经验法则:

  • StringBuilder如果您在循环中连接字符串,请始终使用 a 。
  • StringBuilder如果您要连接一个字符串超过 4 次,请使用 a 。
于 2010-06-18T13:07:56.657 回答
2

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

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

于 2010-06-18T13:01:26.533 回答
1

你真的会在这里使用字符串生成器吗?

Console.WriteLine("MyString");

当您需要进行大量连接来构建字符串时,StringBuilder 非常有用。

Jon Skeet 在这里有一篇很棒的文章: http ://www.yoda.arachsys.com/csharp/stringbuilder.html

查看“所以我应该到处使用 StringBuilder,对吗?”开始的部分。

他写:

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


于 2010-06-18T12:59:59.120 回答
0

就创建字符串而言,StringBuilder 并不比使用字符串快。

当您必须将多个字符串连接在一起(如循环)时,StringBuilder 会更快。当您必须将字符串构建器内容转换为字符串时,您将付出性能损失。

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

于 2010-06-18T13:03:03.033 回答
0

字符串很好,因为它是不可变的。不可变是好的,函数式语言已经证明了这一点。

因为如果您有一个(引用)字符串“这是一个字符串”,您可以确定它将永远具有相同的值。虽然 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
于 2010-06-18T13:04:00.300 回答
0

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

看到这个:StringBuilder vs String

于 2010-06-18T13:06:49.070 回答
0

在以下位置提供了要使用的分析:高效连接字符串

本质上,(尽管阅读链接以进行完整分析),StringBuilder在非平凡循环中连接时使用。

于 2010-06-18T14:58:56.927 回答