从许多字符串文字构建时,StringBuilder 是否有优势?

Does StringBuilder have an advantage when building from many String literals?

根据我对它的理解方式以及大量文章、博客和线程,我了解到当有一个循环构建字符串并且迭代次数未知时,StringBuilder 很有用。最近我看到在构建 sql 字符串时使用了 StringBuilder:

StringBuilder sql = new StringBuilder();
sql.Append("SELECT Field1, Field2";
sql.Append(" FROM Table1 WHERE ID=@ID ");

所以我的问题是 - 在上述场景中使用 StringBuilder 是否比常规 String 有优势?还是个人喜好问题?

更新:我的问题不是一般的 String 与 StringBuilder。刚刚在教科书上看到了一个对我来说不是特别有利的案例,所以想在这里和专家们说明一下

在 C# 中,字符串是不可变的,因此每次添加到字符串时,它都会创建一个新副本。使用 StringBuilder,它将不同的部分保存在内存中,然后 ToString 在最后创建它。

在这种情况下是否有利,很难说,因为您只是将两个字符串附加在一起,而且它们相对较小。加入的次数越多,字符串越大,与将字符串连接在一起并创建新字符串相比,StringBuilder 使用的内存越快越少。

使用 StringBuilder 的决定需要慎重考虑:

  • 如果连接的所有元素都是 String 常量,并且所有部分都无条件地以相同顺序连接,则使用 StringBuilder 是不利的。
  • 如果有条件地将某些元素添加到结果中,StringBuilder 可能会给您带来一些优势。

具体来说,这段代码

string sql = "SELECT Field1, Field2" +
             " FROM Table1 WHERE ID=@ID ";

比使用 StringBuilder 的更好,因为它根本不连接字符串:C# compiler recognizes concatenation of string constants at compile time,并将各个部分粘合到单个 string 对象中。

从字面上看你的例子,最好只做

string sql = "SELECT Field1, Field2 FROM Table1 WHERE ID=@ID";

确实不需要串联。

但是,假设您的示例可能没有完全触及问题的核心,基本上可以归结为 performance vs. readability。如果只是像您列出的几条语句,那么谁会关心您从 StringBuilder 获得的毫秒性能增益?没人,那是谁。

但是如果你正在做很多很多字符串连接(就像你提到的在一个循环中)所有这些毫秒都会加起来,你 注意到差异。

因此对于您给出的案例,只需创建一个简单的字符串即可。对于大量字符串操作,请使用 StringBuilder.

因为你没有指定语言(Java 和 C# 都有类似的 StringBuilder class),我假设它是 C#。

无论哪种方式,使用字符串连接和 StringBuilder 之间的差异在您展示的情况下都非常小,我会考虑选择一种风格。

就个人而言,如果我使用 C#,我发现使用 verbatim string literals 是构建格式良好的 SQL 字符串的最干净的方法:

string sql = @"SELECT Field1, Field2
                 FROM Table1
                WHERE Field1 = @field1
                  AND Field3 = @field3
                ORDER BY Field2";

不涉及连接,当我需要在代码中复制粘贴 SQL 时非常实用。当然,字符串中有更多的空格,但我通常根本不介意,当 运行 和 SQL.

时也没有区别

这可能对您的选择有所帮助。

发件人:https://www.tutorialsteacher.com/csharp/csharp-stringbuilder

"Note : StringBuilder performs faster than string when concatenating multiple strings. Use StringBuilder if you want to append more than three-four string. Appending two or three string is more efficient than using StringBuilder."