从许多字符串文字构建时,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."
根据我对它的理解方式以及大量文章、博客和线程,我了解到当有一个循环构建字符串并且迭代次数未知时,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."