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

时间:2015-08-27 19:59:51

标签: c# string stringbuilder

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

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

所以我的问题是 - 在上面的场景中使用StringBuilder是否优于常规String?或者这是个人偏好的问题?

更新:我的问题不是一般的String vs. StringBuilder。我刚看到一本教科书中的特定案例对我来说并不是特别有利,所以我想在这里与专家一起澄清

4 个答案:

答案 0 :(得分:3)

使用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对象中。

答案 1 :(得分:0)

在C#中,字符串是不可变的,因此每次添加到字符串时,它都会创建一个新副本。使用TimerTask urTask = new TimerTask() { @Override public void run() { handler.post(new Runnable() { public void run() { try { PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask(); // PerformBackgroundTask this class is the class that you put your logic into performBackgroundTask.execute(); } catch (Exception e) { // TODO Auto-generated catch block } } }); } }; timer.schedule(doAsynchronousTask, 0, 30000); //execute in every 30 secs ,它在内存中保存不同的部分,然后StringBuilder在最后创建它。

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

答案 2 :(得分:0)

由于你没有指定语言(Java和C#都有类似的StringBuilder类),我将假设它是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时没有任何区别。

答案 3 :(得分:0)

这可能会帮助您选择。

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

“注意:连接多个字符串时,StringBuilder的执行速度比字符串快。如果要附加三个以上的四个字符串,请使用StringBuilder。附加两个或三个字符串比使用StringBuilder效率更高。”