Я использую отражатель, чтобы посмотреть на реализацию String.Format и всегда был под впечатлением, что перегруженные String.Format, занявшие 1, 2 и 3-х аргументов были оптимизированы версии метода, который принимает массив объектов. Однако я обнаружил, что внутри они создают массив объектов, а затем вызывают метод, который принимает массив объектов.
1 arg
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 добавили эти перегрузки?