在C#getter中使用StringBuilder会特别糟糕吗?
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中会打开一个巨大的蠕虫罐头,是荒谬的开销,有些从来没有在getters中使用构造函数类型的反模式的东西,等等...不知道每个人的最喜欢的最高性能的方式来连接非循环字符串。
编辑2一个getter的通常的最佳实践性能阈值是什么,并且StringBuilder的构造函数是否低于该阈值?
为什么不这样做?
msg + "static string" + Environment.NewLine
它会编译成与第二个例子相同。
更新
你改变了你的代码,看起来你想创建一个包含很多行的非常大的字符串。
那么我想使用StringBuilder
是很好的,但我建议你让它成为一种方法 (如何重写ToString
?)而不是属性,以便调用者不太可能认为调用它很便宜。
从性能角度来看,使用提供的数据(三个子字符串),String.Concat更好。
但是,如果在getter内部,你有像if(state == 0)
这样的行会破坏Concat或+运算符的效率,那么使用StringBuilder在字符串内存处理方面效率很高,并且在AppendLine上的语法清晰。 看看这个网站上的关于StringBuilder
vs Concat
vs +
以及关于StringBuilder技巧和错误的一些信息
当不使用大量字符串时,String.Concat函数的性能优于StringBuilder 2.3倍。 另外,如果你编写的代码如“a”+“b”+“c”+“d”+“f”,编译器会编译它以在IL代码中使用string.Concat(string [])。
链接地址: http://www.djcxy.com/p/31495.html上一篇: Would it be particuarly bad to use a StringBuilder in a C# getter?
下一篇: Private vs Protected