在C#getter中使用StringBuilder会特别糟糕吗?

在C#getter中使用StringBuilder会特别糟糕吗?,c#,stringbuilder,getter,C#,Stringbuilder,Getter,getter将获得一条关于其所在结构状态的消息,该消息由结构的有限属性组合定义 首先,这不是关于,我只是认为: StringBuilder msg = new StringBuilder(); ... msg.AppendLine("static string"); ... 那么看起来更干净了: String msg = String.Empty; ... msg = String.Concat(msg, "static string", System.Environment.NewLine)

getter将获得一条关于其所在结构状态的消息,该消息由结构的有限属性组合定义

首先,这不是关于,我只是认为:

StringBuilder msg = new StringBuilder();
...
msg.AppendLine("static string");
...
那么看起来更干净了:

String msg = String.Empty;
...
msg = String.Concat(msg, "static string", System.Environment.NewLine)
...
所以这只是一个审美选择

msg变量无论如何都必须初始化为空,这样额外的一行就不会让我出错。但在返回字符串的字段中构造新的StringBuilder有多糟糕

编辑 我只是想知道在getter中放置StringBuilder构造函数是否会打开一个巨大的蠕虫罐,这是非常可笑的开销,有些人从不在getter中使用构造函数,这是一种反模式的东西,等等。。。不知道每个人最喜欢的连接非循环字符串的最有效的方法

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

为什么不这样做

msg + "static string" + Environment.NewLine
它将编译为与第二个示例相同的代码

更新

您更改了代码,似乎希望创建一个包含大量行的非常大的字符串

那么我想使用
StringBuilder
是可以的,但我建议您将其设置为方法(覆盖
ToString
?)而不是属性,这样调用方就不太可能认为调用成本低。

为什么不这样做呢

msg + "static string" + Environment.NewLine
它将编译为与第二个示例相同的代码

更新

您更改了代码,似乎希望创建一个包含大量行的非常大的字符串


那么我想使用
StringBuilder
是可以的,但我建议您将其设置为方法(覆盖
ToString
?)而不是属性,这样调用者就不太可能认为调用它很便宜了。

从性能的角度来看,在提供数据(三个子字符串)的情况下,字符串。Concat更好


但是,如果在getter内部,您有像
if(state==0)
这样的行,它们会破坏Concat或+运算符的效率,然后使用StringBuilder,因为它在字符串内存处理方面有很好的效率,并且在AppendLine上有清晰的语法。查看有关
StringBuilder
vs
Concat
vs
+
的数据,以及从性能角度来看有关StringBuilder和的一些信息,在提供数据(三个子字符串)的情况下,字符串.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[])。

string.Concat函数在不使用大量字符串的情况下比StringBuilder性能好2.3倍。此外,例如,如果您编写“a”+“b”+“c”+“d”+“f”这样的代码,编译器将对其进行编译,以便在IL代码中使用string.Concat(string[])。

除了当前的答案之外,还应该说,考虑到您正在讨论的是结构的属性(我不认为它们是1000,但是..),这对mantion事实很重要,这种差异不仅在语义上存在,而且在实际的功能上也存在

简明扼要地说:

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


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

除了现在的答案应该说,考虑到您正在谈论的是结构的属性(我不认为它们是1000,但是…),重要的是,这种差异不仅在语义上存在,而且在实际的功能上也存在

简明扼要地说:

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


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

+1从美学角度看,这是最简单、可读的选择。选择不使用
String.Concat
,但考虑使用
StringBuilder
对我来说非常奇怪。我自己从来都不喜欢使用+进行连接,但这可能是我在其他语言中养成的习惯。因为+看起来不好,所以必须使用赋值运算符,而AppendLine看起来更好,IMHO。再说一次,它的美学,并不是说你错了。@capn你也写了
十进制。加上(1M,1M)
而不是
1M+1M
?@Magnus当我这样使用运算符时,我也得到了2M而不是“11”。这对我来说似乎更有意义;)+1美学上,这是最简单、可读的选择。选择不使用
String.Concat
,但考虑使用
StringBuilder
对我来说非常奇怪。我自己从来都不喜欢使用+进行连接,但这可能是我在其他语言中养成的习惯。因为+看起来不好,所以必须使用赋值运算符,而AppendLine看起来更好,IMHO。再说一次,它的美学,并不是说你错了。@capn你也写了
十进制。加上(1M,1M)
而不是
1M+1M
?@Magnus当我这样使用运算符时,我也得到了2M而不是“11”。这