带有“+”的字符串格式和构造字符串

时间:2011-02-27 01:32:19

标签: c# string stringbuilder

我想问一下人们在编写字符串方面的想法,以及构建字符串时性能是否存在巨大差异。

近年来我一直被告知永远不要做以下事情:

string dogName = "Ralph";
DateTime bornDate = DateTime.Parse("2010-01-01");

string fullText = "I am a Dog and my name is " + dogName + " and i was born on the " + bornDate.ToString("dd/MM/yyyy");

总是告诉他们类似的事情。

string dogName = "Ralph";
DateTime bornDate = DateTime.Parse("2010-01-01");

string fullText2 = String.Format("I am a Dog and my name is {0} and i was born on the {1:dd/MM/yyyy}", dogName, bornDate);

我看到使用后面的声明的原因,但是有人知道第一个声明存在什么类型的性能问题。

使用StringBuilder对象而不是使用

string str = "Adding this comment to the string\n"
str += "Then Add this line";

并使用以下内容:

StringBuilder sb = new StringBuilder();

sb.AppendLine("Add This Comment");
sb.AppendLine("Then add this comment");

string output = sb.ToString();

我的团队中有一些开发人员在工作中有点老派VB6程序员,我想向他们解释为什么这是一个坏主意。

他们不断为代码SQL语句执行初始代码示例。

如果是的话:):

3 个答案:

答案 0 :(得分:6)

  

String或的串联操作的性能   StringBuilder对象取决于内存分配发生的频率。   字符串连接操作总是分配内存,而a   StringBuilder连接操作只分配内存   StringBuilder对象缓冲区太小,无法容纳新数据。   因此,String类更适合串联   如果连接了固定数量的String对象,则进行操作。在   在这种情况下,单个连接操作甚至可能是   由编译器组合成单个操作。一个StringBuilder   如果是任意的,则对象优选用于连接操作   串联的数量;例如,如果一个循环   连接随机数量的用户输入字符串。

来源:http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

答案 1 :(得分:5)

当您构建一个需要大量连接的非常大的字符串时,StringBuilder实际上仅在性能意义上有用。对于您提供的小样本,我认为使用+运算符就可以了。

说到String.Format,我认为应该用它来提高代码的可读性或灵活性,但不是出于性能原因。 String.Format还具有支持本地化的额外好处,这在使用+运算符时并不容易。

在我遇到串联导致严重性能问题的经历中,我从未遇到过这样的情况,所以在尝试优化性能之前,我总是选择最易读的代码。

答案 2 :(得分:1)

我知道Java实际上使用StringBuffer(Java的StringBuilder版本)将一行中的+优化为一个语句,所以我猜C#可能会做同样的事情。因此它不应该真正有所作为。只有当一行是程序中执行次数最多的行时,才真正值得看一下差异(假设它存在)。

然而,当你使用+ =语句而不是使用StringBuildert构建整个页面时,差异非常明显;)我曾经重写了一个ASP.NET C#页面,它实际上都将(大)SQL查询构建为整个响应使用+ =而不是StringBuilders。我将加载时间从20秒降低到<1秒;所以是的,尽量避免使用+ =来构建字符串。