你什么时候使用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个完成了工作。