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

时间:2008-12-08 14:32:19

标签: c# .net formatting stringbuilder

关于使用String.Format()的最新question came up。我的部分答案包括使用StringBuilder.AppendLine(string.Format(...))的建议。 Jon Skeet认为这是一个不好的例子,建议使用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"));

7 个答案:

答案 0 :(得分:60)

我查看AppendFormat后跟AppendLine不仅更具可读性,而且比调用AppendLine(string.Format(...))更高效。

后者创建一个全新的字符串,然后将其批量附加到现有构建器中。我不打算说“为什么还要使用StringBuilder呢?”但它似乎有点违背了StringBuilder的精神。

答案 1 :(得分:13)

只需创建一个扩展方法。

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方法的每个重载中添加其中一个。

答案 2 :(得分:11)

String.format在内部创建StringBuilder对象。通过做

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

字符串构建器的另一个实例,创建了所有开销。


mscorlib上的反射器,Commonlauageruntimelibary,System.String.Format

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();
}

答案 3 :(得分:2)

如果性能很重要,请尽量避免使用AppendFormat()。改为使用多个Append()或AppendLine()调用。这确实使您的代码更大,更不易读,但它更快,因为不必进行字符串解析。字符串解析比你想象的要慢。

我通常使用:

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");

(当然,如果“First”和“Second”不是字符串文字,这会更有意义)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我更喜欢这种结构:

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

虽然可以肯定的是,有一些东西可以说是为了分隔换行符。

答案 6 :(得分:0)

仅仅使用

是非常糟糕的
sbuilder.AppendFormat("{0} line\n", first);

?我的意思是,我知道它不是平台独立的或者其他什么,但在10个案例中,有9个案例可以完成工作。