getter将获得有关它所在的struct的状态的消息,它由struct的属性的组合定义,这些属性是有限的 .
首先,这不是关于micro-optimization,我只是认为:
StringBuilder msg = new StringBuilder();
...
msg.AppendLine("static string");
...
看起来更清洁:
String msg = String.Empty;
...
msg = String.Concat(msg, "static string", System.Environment.NewLine)
...
所以只是一种美学选择 .
msg变量必须以任何方式初始化为空,因此额外的行不会给我带来麻烦 . 但是在返回字符串的字段中构造一个新的StringBuilder有多糟糕?
EDIT 我只是想知道将一个StringBuilder构造函数放入一个getter中是否会打开一大堆蠕虫,开头是荒谬的,有些人从来没有在getter中使用构造函数那种反模式的东西等等...不知道每个人的最喜欢连接非循环字符串的最佳方式 .
EDIT2 getter的常用,最佳实践,性能阈值是什么,StringBuilder构造函数是否低于该值?
4 回答
为什么不这样做?
它将编译为与第二个示例相同的内容 .
Update
您更改了代码,以便您想要创建包含大量行的非常大的字符串 .
然后我觉得使用
StringBuilder
没关系,但是我建议你把它变成 method (如何覆盖ToString
?)而不是属性,以便调用者不太可能认为调用便宜 .从性能的角度来看,使用提供的数据(三个子字符串),String.Concat更好 .
但是,如果在getter中,你有像
if(state == 0)
这样的行来破坏Concat或运算符的效率,那么就使用StringBuilder来提高字符串内存处理的效率,以及它在AppendLine上的清晰语法 . 查看this site获取有关StringBuilder
vsConcat
vs+
的数据以及有关StringBuilder tips和mistakes的一些信息String.Concat函数在不使用大量字符串时优于StringBuilder 2.3倍 . 另外,例如,如果您编写类似“a”“b”“c”“d”“f”的代码,编译器将编译它以在IL代码中使用string.Concat(string []) .
除了现在应该说的答案,考虑到你认为你是1000s,但是......),重要的是提到事实,在现有的语义中差异不是 only ,而是在实际的功能上 .
更短更清晰:
每次调用
+
和string.Concat
都会创建一个新的字符串对象 .如果使用
StringBuilder
,则它会在一个字符串缓冲区上运行 . 因此,从性能的角度来看,如果你有一个很长的字符串可以使用StringBuilder
,这是非常方便的 .