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

问题描述 投票:10回答:3

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

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

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语句执行初始代码示例。

如果是当然:)

c# string stringbuilder
3个回答
6
投票

String或StringBuilder对象的串联操作的性能取决于内存分配发生的频率。字符串连接操作始终分配内存,而StringBuilder连接操作仅在StringBuilder对象缓冲区太小而无法容纳新数据时分配内存。因此,如果连接固定数量的String对象,则String类更适合并置操作。在这种情况下,编译器甚至可以将单个连接操作组合成单个操作。如果连接任意数量的字符串,则StringBuilder对象最好用于连接操作;例如,如果循环连接随机数量的用户输入字符串。

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


5
投票

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

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

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.