你什么时候使用StringBuilder.AppendLine / string.Format与StringBuilder.AppendFormat?

最近出现了一个关于使用String.Format()的问题。 我的答案的一部分包括build议使用StringBuilder.AppendLine(string.Format(…))。 乔恩Skeetbuild议这是一个不好的例子,并提出使用AppendLine和AppendFormat的组合。

在我看来,我从未真正将自己置于使用这些方法的“首选”方法之中。 我想我可能会开始使用类似以下的内容,但有兴趣知道其他人使用什么作为“最佳实践”:

sbuilder.AppendFormat("{0} line", "First").AppendLine(); sbuilder.AppendFormat("{0} line", "Second").AppendLine(); // as opposed to: sbuilder.AppendLine( String.Format( "{0} line", "First")); sbuilder.AppendLine( String.Format( "{0} line", "Second")); 

我查看AppendFormat后跟AppendLine不仅更可读,但也比调用AppendLine(string.Format(...))更高性能。

后者创build一个全新的string,然后将其批量添加到现有的构build器中。 我不会去说“为什么麻烦使用StringBuilder呢?” 但它似乎有点反对StringBuilder的精神。

String.format在内部创build一个StringBuilder对象。 通过做

 sbuilder.AppendLine( String.Format( "{0} line", "First")); 

string生成器的一个额外的实例,所有的开销都被创build。


mscorlib,Commonlauageruntimelibary,System.String.Format上的reflection

 public static string Format(IFormatProvider provider, string format, params object[] args) { if ((format == null) || (args == null)) { throw new ArgumentNullException((format == null) ? "format" : "args"); } StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8)); builder.AppendFormat(provider, format, args); return builder.ToString(); } 

只需创build一个扩展方法。

 public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args) { builder.AppendFormat(format, args).AppendLine(); return builder; } 

我更喜欢这个理由:

  • 如上所述,不会像AppendLine(string.Format(...))那样受到太多的开销。
  • 防止我忘记在最后添加.AppendLine()部分(经常发生)。
  • 更可读(但更多的意见)。

如果你不喜欢它被称为“AppendLine”,你可以改变它为“AppendFormattedLine”或任何你想要的。 我喜欢与其他呼叫“AppendLine”排队的所有事物:

 var builder = new StringBuilder(); builder .AppendLine("This is a test.") .AppendLine("This is a {0}.", "test"); 

只要在StringBuilder的AppendFormat方法中为每个重载添加一个。

如果性能很重要,请尝试完全避免AppendFormat()。 改用多个Append()或AppendLine()调用。 这确实会使你的代码变得更大,可读性更差,但是速度更快,因为不需要进行stringparsing。 stringparsing比你想象的要慢。

我一般使用:

 sbuilder.AppendFormat("{0} line", "First"); sbuilder.AppendLine(); sbuilder.AppendFormat("{0} line", "Second"); sbuilder.AppendLine(); 

除非性能是至关重要的,在这种情况下,我会使用:

 sbuilder.Append("First"); sbuilder.AppendLine(" line"); sbuilder.Append("Second"); sbuilder.AppendLine(" line"); 

(当然,如果“第一”和“第二”不是string文字,这会更有意义)

AppendFormat()比AppendLine(String.Format())更可读

我更喜欢这种结构:

 sbuilder.AppendFormat("{0} line\n", "First"); 

虽然承认有一些东西要分开的断行。

简单地使用它只是非常可怕的

 sbuilder.AppendFormat("{0} line\n", first); 

? 我的意思是,我知道这不是平台无关的,但在10个案例中有9个完成了工作。