.net - 为什么存在 String.Format 的重载?

标签 .net string.format base-class-library

我正在使用 Reflector 查看 String.Format 的实现,并且一直认为采用 1、2 和 3 个参数的 String.Format 重载是采用对象数组的方法的优化版本。但是,我发现他们在内部创建了一个对象数组,然后调用了一个采用对象数组的方法。

1 个参数

public static string Format(string format, object arg0)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    return Format(null, format, new object[] { arg0 });
}

2 个参数

public static string Format(string format, object arg0, object arg1)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    return Format(null, format, new object[] { arg0, arg1 });
}

3 个参数

public static string Format(string format, object arg0, object arg1, object arg2)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    return Format(null, format, new object[] { arg0, arg1, arg2 });
}

对象数组

public static string Format(string format, params object[] args)
{
    if ((format == null) || (args == null))
    {
        throw new ArgumentNullException((format == null) ? "format" : "args");
    }
    return Format(null, format, args);
}

在内部,它们最终都使用相同的代码,因此使用 1、2 和 3 参数版本并不比对象数组版本快。

所以我的问题是 - 它们为什么存在?

当您使用带有逗号分隔的值列表的对象数组版本时,由于 params/ParamArray 关键字,编译器会自动将参数转换为对象数组,这实际上是 1、2 和 3 版本所做的,因此它们显得多余。为什么 BCL 设计者要添加这些重载?

最佳答案

正如 Hans 提到的,其中一个原因是在格式化字符串的大多数常见情况下,创建数组会带来很多不必要的开销。这节省了 EXE 中的空间。

另一个原因是并非所有语言都支持可变参数函数(在 C# 中使用 params)。这允许这些语言的用户避免为最常见的字符串格式化情况创建数组。对于没有用于数组创建和初始化的简单语法的语言,这可以节省很多。

关于.net - 为什么存在 String.Format 的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38655626/

相关文章:

c# - 将 DataTable 传递给 IronPython

c# - 格式化字符串-编译时检查

c# - 在 asp.net MVC 中使用 string.format 时如何更改字体大小

c# - 数组的结构比较

.net - System.Windows.Forms.WebBrowser : force X86?

.net - .net object = null game 何时用于垃圾收集?范围重要吗?

c++ - C++ 的 String.Format

.net - 如何在基类库中找到实现特定接口(interface)的类型列表?

c# - 目录的最大字符数或长度是多少?

c# - 企业设计模式问题