小编典典

是String.Format和StringBuilder一样有效

c#

假设我在C#中有一个stringbuilder可以做到这一点:

StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();

是否会比拥有以下产品效率更高或更有效?

string cat = "cat";
string s = String.Format("The {0} in the hat", cat);

如果是这样,为什么?

编辑

经过一些有趣的回答后,我意识到我可能应该对自己的询问更加清楚。我没有这么多的要求这是在连接字符串更快,但更快 注入 一个串到另一个。

在以上两种情况下,我都希望将一个或多个字符串注入到预定义模板字符串的中间。

对困惑感到抱歉


阅读 462

收藏
2020-05-19

共1个答案

小编典典

注意: 此答案是在.NET 2.0是当前版本时编写的。这可能不再适用于更高版本。

String.Format``StringBuilder内部使用:

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

上面的代码是mscorlib的摘录,因此问题变成“
StringBuilder.Append()StringBuilder.AppendFormat()” 更快?

如果没有基准测试,我可能会说,使用可以使上述代码示例运行得更快.Append()。但这是一个猜测,请尝试对这两者进行基准测试和/或性能分析以进行适当的比较。

这一章杰里·迪克森(Jerry Dixon)做了一些基准测试:

http://jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm

更新:

遗憾的是,以上链接自此消失了。但是,“返回机器”上仍然有一个副本:

http://web.archive.org/web/20090417100252/http://jdixon.dotnetdevelopersjournal.com/string_concatenation_stringbuilder_and_stringformat.htm

归根结底,这取决于是否要重复调用字符串格式,即要对100兆字节的文本进行认真的文本处理,还是当用户一次又一次单击按钮时调用它。除非您要执行大量的批处理工作,否则我将坚持使用String.Format,它有助于提高代码的可读性。如果您怀疑性能瓶颈,请在代码上粘贴探查器,然后查看其实际位置。

2020-05-19