【问题标题】:Why does string.Format come in several flavors?为什么 string.Format 有几种风格?
【发布时间】:2009-08-10 08:24:22
【问题描述】:

.NET 提供了四个非常相似的String.Format(...) 版本(不包括采用IFormatProvider 参数的版本):

Format(String, Object)
将指定字符串中的一个或多个格式项替换为指定对象的字符串表示形式。
Format(String, Object, Object)
将指定字符串中的格式项替换为两个指定对象的字符串表示形式。 Format(String, Object, Object, Object)
将指定字符串中的格式项替换为三个指定对象的字符串表示形式。 Format(String, Object[])
将指定字符串中的格式项替换为指定数组中对应对象的字符串表示形式。

为什么不只使用带有(params) object[] 参数的那个?具有固定数量参数(1、2 和 3)的单独方法是否有性能提升?
想必现实世界中大多数对string.Format的调用都有1-3个参数。

【问题讨论】:

  • 有一个参数过载:public static string Format(string format, params object[] args);
  • 这就是我所说的“为什么不只有一个带有 params object[] 参数的?”...我会澄清的。
  • 我的意思是,为什么还有其他三个版本?

标签: .net performance string formatting


【解决方案1】:

这可能是 .NET Framework 早期实现的遗留物;如果您查看* Format(string, object)Format(string, object, object) 等方法的实现,您会看到他们都调用Format(IFormatProvider, string, object[])。所以绝对没有任何性能优势(如果您的构建在调试模式下运行,调用对象重载的效率会更低——不是说您可以测量它)。

我能想到的唯一技术原因是,这些重载对于不支持 params 参数的语言很有用。在这种情况下,程序员仍然可以调用 String.Format("Hello {0}", "world"),而不是强制他们创建一个临时数组(这是 params 参数建议编译器执行的操作)。这也解释了为什么只有 3 个对象重载:这些覆盖了所有 String.Format 调用的 99%。

*) 使用 Reflector 或过时的 Rotor 代码库。

【讨论】:

    【解决方案2】:

    是的。构建数组并传递该数组而不是简单地在堆栈上传递单个参数存在性能差异。此外,由于 .NET 旨在支持多种语言,因此他们可能一直在这样做以支持一些不支持自动打包 params 数组参数的可能假设语言的正常 String.Format 语法。

    【讨论】:

    • 好吧。如果您要自己编写 String.Format 函数,您可能选择不关心,但 Microsoft 构建了一个在许多情况下使用的框架。充分利用每个处理器周期对他们来说是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多