2010-06-18 58 views
5

很多问题已经被问及字符串和字符串生成器之间的差异,大多数人认为字符串生成器比字符串更快。我很想知道字符串生成器是否太好,为什么字符串在那里?此外,有些身体可以给我一个例子,其中字符串比字符串生成器更有用吗?字符串比StringBuilder更有用吗?

+2

请参阅http://www.yoda.arachsys.com/csharp/stringbuilder.html – 2010-06-18 13:02:36

+1

http://www.joelonsoftware.com/articles/fog0000000319.html Joel On Software对您实际发生的事情有很好的解释连接两个字符串。这篇文章是关于C++的,但C#的工作原理也是一样的。忽略“我如何解决这个问题?”中的所有内容?部分,因为那部分是C++特定的;在C#中,您可以使用'StringBuilder'修复它,它与“我如何解决此问题”部分中的内容类似。 – Brian 2010-06-18 13:07:47

+0

可能重复的[字符串与StringBuilder](http://stackoverflow.com/questions/73883/string-vs-stringbuilder) – nawfal 2014-07-16 20:08:11

回答

3

这不是哪个是比较的情况下,有用...

A String是一个String - 彼此相邻的一个或多个字符。如果你想变化以某种方式字符串,它只会创造更多的字符串,因为他们是immutable

A StringBuilder是创建字符串的类。它提供了一种构建方法,不需要在内存中创建大量的缩进字符串。最终结果将始终为String

不要这样做

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

s = s + " is now longer again"; 

这会在内存中创建字符串(在现实中,见下文)。

这样做:

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(); 

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

你可以这样做:

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

这仅在内存中创建字符串。

作为一个附注,创建StringBuilder的确会占用一定量的内存。作为一个粗略的经验法则:

  • 如果您在循环中连接字符串,请始终使用StringBuilder
  • 如果您将串连接了4次以上,请使用StringBuilder
+1

string.Concat也是一个可行的解决方案,您的例。 'string s = string.Concat(“我的字符串”,“现在更长一点”,“现在再长一点”);' – 2010-06-18 17:27:00

+0

好点。我想这是一个有趣的问题。 – 2010-06-18 21:23:18

1

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

Console.WriteLine("MyString"); 

当你需要做大量的连接来建立一个字符串时,StringBuilder非常棒。

乔恩斯基特对这个位置有很大aricle:http://www.yoda.arachsys.com/csharp/stringbuilder.html

退房启动部分“所以我应该使用StringBuilder无处不在,对吧?”

他写道:

这个 例子和前一个之间的重要区别是, 我们可以很容易地提供其需要在一个呼叫String.Concat要连接在一起 的所有字符串 。 表示不需要中间字符串 。 StringBuilder的是 第一个例子中有效的,因为它充当中间结果 一个 容器,而无需该结果 每次复制 - 当没有 中间结果,无论如何,它没有 优势。


+0

谢谢布兰丹..链接真的很好 – DJay 2010-06-18 13:40:55

2

StringBuilder的是更好,当你需要更改值。否则,不需要它。

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

7

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

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

也有类似的问题? String vs. StringBuilder

0

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

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

StringBuilder相对于字符串的真正优势之一是,您可以通过几种方法传递它,并沿途追加字符串。你不能通过传递一个字符串对象来做到这一点。所以,如果你有一个递归操作,你像JSON对象那样构建,你可以通过StringBuilder并附加值。

11

正如其名称所示,StringBuilder用于构建字符串,而字符串是不可变的字符值。当你想要传递字符数据时使用字符串,当你想操纵字符数据时使用StringBuilder。

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 
0

可以在Concatenating Strings Efficiently处提供有关使用的分析。

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

相关问题