为什么的String.format有几种口味?(Why does string.Format com

2019-09-22 17:12发布

.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个参数。

Answer 1:

这可能是从早期实施的.NET Framework的遗迹; 如果你想看看*的格式(字符串对象), 格式(字符串,对象,对象)等方法的实现,你会看到,他们都调用格式(的IFormatProvider,字符串,对象[])。 所以这是绝对没有任何性能上的好处(如果你的构建在调试模式下运行,它甚至更少effecient调用对象重载 - 不是说你就可以测量它)。

唯一thechnical原因,我能想到的,就是这些重载方法对那些不支持PARAMS参数语言有用。 在这种情况下,程序员仍然可以调用的String.Format(“你好{0}”,“世界”),而这迫使他们创建一个临时数组(这是什么PARAMS论据表明编译器执行)。 这也解释了为什么目前只有3对象重载:这些覆盖所有的String.Format通话的99%。

*)使用反射器或过时转子的代码库。



Answer 2:

是。 存在与建立一个数组并传递一个而不是简单地通过个人参数上栈相关联的性能差异。 此外,由于.NET被设计成支持多国语言,他们可能已经这样做是为了支持正常String.Format语法是不支持自动包装一些可能的假想语言params阵列参数。



文章来源: Why does string.Format come in several flavors?