C# 何时使用StringBuilder.AppendLine/string.Format与StringBuilder.AppendFormat?

C# 何时使用StringBuilder.AppendLine/string.Format与StringBuilder.AppendFormat?,c#,.net,formatting,stringbuilder,C#,.net,Formatting,Stringbuilder,关于使用String.Format()的最新信息。我的部分回答包括使用StringBuilder.AppendLine(string.Format(…)的建议。Jon Skeet认为这是一个糟糕的例子,并建议使用AppendLine和AppendFormat的组合 我突然想到,我从来没有真正确定自己使用这些方法的“首选”方法。我想我可能会开始使用以下内容,但我想知道其他人使用什么作为“最佳实践”: 我认为AppendFormat后跟AppendLine不仅比调用AppendLine(string

关于使用String.Format()的最新信息。我的部分回答包括使用StringBuilder.AppendLine(string.Format(…)的建议。Jon Skeet认为这是一个糟糕的例子,并建议使用AppendLine和AppendFormat的组合

我突然想到,我从来没有真正确定自己使用这些方法的“首选”方法。我想我可能会开始使用以下内容,但我想知道其他人使用什么作为“最佳实践”:


我认为
AppendFormat
后跟
AppendLine
不仅比调用
AppendLine(string.Format(…)
更可读,而且性能更高


后者创建一个全新的字符串,然后将其全部附加到现有的生成器中。我不会说“那么为什么要麻烦使用StringBuilder呢?”但这似乎有点违背StringBuilder的精神。

AppendFormat()比AppendLine(String.Format())可读性强得多。

我更喜欢这种结构:

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

尽管不可否认,在区分换行符方面有一些说法。

仅仅使用换行符确实很可怕吗

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

??我的意思是,我知道它不是独立于平台或其他什么的,但在10种情况下,有9种情况下它能完成任务。

如果性能很重要,请尝试完全避免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");

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

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

只需创建一个扩展方法

public static StringBuilder AppendLine(this StringBuilder builder, string format, params object[] args)
{
    builder.AppendFormat(format, args).AppendLine();
    return builder;
}
我喜欢这样做的原因:

  • 如上所述,它不会像追加行(string.Format(…)那样承受太多的开销
  • 防止我忘记在末尾添加
    .AppendLine()
    部分(发生频率足够高)
  • 更具可读性(但这更像是一种观点)
如果您不喜欢将其命名为“AppendLine”,可以将其更改为“AppendFormattedLine”或任何您想要的内容。不过,我很喜欢与其他“AppendLine”通话:

var builder = new StringBuilder();

builder
    .AppendLine("This is a test.")
    .AppendLine("This is a {0}.", "test");

在StringBuilder上使用AppendFormat方法时,只需为每个重载添加一个即可。

是的,我会完全接受这一点(顺便说一句,谢谢你一开始就让我这么做)。没问题-如果我的语气在原始评论中显得生硬,我很抱歉。多任务处理有时会对我造成影响:(也许您的代码示例可以说明这两种情况?:)我倾向于使用\r\n,但我更喜欢使用不太方便的Environment.NewLine。因此,我提出了一个问题。我所做的基准测试显示,当使用单独的Append()调用而不是使用带有4个参数的单个AppendFormat()调用时,性能提高了5倍。
var builder = new StringBuilder();

builder
    .AppendLine("This is a test.")
    .AppendLine("This is a {0}.", "test");