C# 哪里字符串比StringBuilder更有用?

C# 哪里字符串比StringBuilder更有用?,c#,string,stringbuilder,heuristics,C#,String,Stringbuilder,Heuristics,关于字符串和字符串生成器之间的区别,已经有很多问题被问到,大多数人认为字符串生成器比字符串更快。我很想知道字符串生成器是否太好了,为什么会有字符串?此外,有人能给我举个例子,说明字符串比字符串生成器更有用吗?你真的会在这里使用字符串生成器吗 Console.WriteLine("MyString"); 当您需要进行大量连接以构建字符串时,StringBuilder非常有用 Jon Skeet在这一点上有很强的说服力: 查看“所以我应该在任何地方使用StringBuilder,对吗?” 他写道:

关于字符串和字符串生成器之间的区别,已经有很多问题被问到,大多数人认为字符串生成器比字符串更快。我很想知道字符串生成器是否太好了,为什么会有字符串?此外,有人能给我举个例子,说明字符串比字符串生成器更有用吗?

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

Console.WriteLine("MyString");
当您需要进行大量连接以构建字符串时,StringBuilder非常有用

Jon Skeet在这一点上有很强的说服力:

查看“所以我应该在任何地方使用StringBuilder,对吗?”

他写道:

这两者之间的重要区别 前一个例子是 我们可以很容易地呈现所有的字符串 需要连接在一起 在一次对String.Concat的调用中。那个 意味着不需要中间字符串 需要。StringBuilder在以下方面非常有效: 第一个例子是因为它充当 中间结果的容器 不必复制结果 每次-当没有 中间结果无论如何,它没有 优势


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


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

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

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


类似的问题

StringBuilder的速度并不比使用字符串快,只需创建字符串即可

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


StringBuilder相对于string的一个真正优势是,您可以通过多种方法传递它,并在传递过程中附加字符串。您不能通过传递字符串对象来实现这一点。因此,如果您有一个像JSON对象之类的递归操作,您可以传递StringBuilder并附加值。

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

字符串是好的,因为它是不可变的。不可变是好的,这是函数式语言所证明的

因为如果您有一个(引用)字符串“thisastring”,您可以确保它将永远具有相同的值。而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
是一个创建字符串的类。它提供了一种构造它们的方法,而无需在内存中创建大量冗余字符串。最终结果总是一个
字符串

不要这样做

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

请参阅Joel On Software对连接两个字符串时实际发生的情况进行了很好的解释。文章是关于C++的,但C语言的工作方式是相同的。忽略“我如何修复这个”部分中的所有内容,因为这一部分是C++特定的;在C#中,您可以使用
StringBuilder
来修复它,其工作原理与“如何修复此问题”一节中的内容类似。字符串的可能重复。Concat也是您的示例的可行解决方案<代码>字符串s=string.Concat(“我的字符串”,“现在长了一点”,“现在又长了”)