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(“我的字符串”,“现在长了一点”,“现在又长了”)代码>