Я использовал Отражатель для рассмотрения реализации Строки. У формата и всегда создавалось впечатление что перегрузки Строки. Формат, который взял 1, 2 и 3 аргумента, был оптимизированными версиями метода, который берет объектный массив. Однако то, что я нашел, было то, что внутренне они создают объектный массив и затем называют метод, который берет объектный массив.
1 аргумент
public static string Format(string format, object arg0)
{
if (format == null)
{
throw new ArgumentNullException("format");
}
return Format(null, format, new object[] { arg0 });
}
2 args
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 args
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 добавляли эти перегрузки?
Одна из причин, как упоминает Ханс, заключается в том, что создание массива - это много ненужных накладных расходов в наиболее распространенных случаях форматирования строки. Это экономит место в EXE.
Другая причина в том, что не все языки поддерживают вариативные функции (использование params
в C #). Это позволяет пользователям этих языков избегать создания массивов для наиболее распространенных случаев форматирования строк. Это значительно экономит для языков, в которых нет простого синтаксиса для создания и инициализации массивов.
Вы забываете о коде в приложении, необходимом для совершения звонка. Создание массива и его заполнение требует гораздо большего количества IL, чем просто передача 3 аргументов.