0

getter 将收到有关其所在结构状态的消息,该状态由结构属性的组合定义,这些属性是有限的。

首先,这与微优化无关,我只是认为:

StringBuilder msg = new StringBuilder();
...
msg.AppendLine("static string");
...

看起来更干净:

String msg = String.Empty;
...
msg = String.Concat(msg, "static string", System.Environment.NewLine)
...

所以只是一种审美选择。

msg 变量必须以任何方式初始化为空,因此额外的行不会打扰我。但是在返回字符串的字段中构造一个新的 StringBuilder 有多糟糕呢?

编辑 我只是想知道将 StringBuilder 构造函数放在 getter 中是否会打开一大堆蠕虫,这是荒谬的开销,有些人从不使用 getter 中的构造函数,等等……不知道每个人的最喜欢的连接非循环字符串的最高效方式。

EDIT2 getter 通常的最佳实践性能阈值是什么,StringBuilder 构造函数是否低于该阈值?

4

4 回答 4

5

为什么不这样做?

msg + "static string" + Environment.NewLine

它将编译为与您的第二个示例相同。

更新

您更改了代码,看起来您想要创建一个包含很多行的非常大的字符串。

那么我想使用它很好StringBuilder,但我建议你把它变成一个方法(覆盖怎么样ToString?)而不是一个属性,这样调用者就不太可能认为调用它很便宜。

于 2012-05-14T20:57:15.657 回答
1

从性能的角度来看,使用提供的数据(三个子字符串),String.Concat 更好。

但是,如果在 getter 内部,您有这样的行if(state == 0)会破坏 Concat 或 + 运算符的效率,那么请使用 StringBuilder,因为它在字符串内存处理方面具有良好的效率,并且在 AppendLine 上具有清晰的语法。查看此站点以获取有关StringBuildervs Concatvs的数据+以及有关 StringBuilder提示错误的一些信息

于 2012-05-14T20:57:43.253 回答
0

除了现在应该说的答案之外,考虑到您正在谈论结构的属性(我认为这不是 1000,但是..),重要的是要强调事实,差异不仅在于语义存在,但在实际功能中也是如此。

更短更清晰:

+string.Concat在每次调用时创建一个的字符串对象。

相反,如果您使用StringBuilder,它将在一个字符串缓冲区上运行。因此,从性能的角度来看,StringBuilder如果您要编写长字符串,则使用它非常方便。

于 2012-05-14T21:05:41.090 回答
0

在不使用大量字符串时,String.Concat 函数的性能比 StringBuilder 高 2.3 倍。此外,例如,如果您编写诸如“a”+“b”+“c”+“d”+“f”之类的代码,编译器将编译它以在 IL 代码中使用 string.Concat(string[])。

于 2012-05-14T21:03:27.947 回答