我正在使用 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 设计者要添加这些重载?