Почему делают перегрузки Строки. Формат существует?

Я использовал Отражатель для рассмотрения реализации Строки. У формата и всегда создавалось впечатление что перегрузки Строки. Формат, который взял 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 добавляли эти перегрузки?

17
задан JasonMArcher 5 September 2014 в 05:37
поделиться

2 ответа

Одна из причин, как упоминает Ханс, заключается в том, что создание массива - это много ненужных накладных расходов в наиболее распространенных случаях форматирования строки. Это экономит место в EXE.

Другая причина в том, что не все языки поддерживают вариативные функции (использование params в C #). Это позволяет пользователям этих языков избегать создания массивов для наиболее распространенных случаев форматирования строк. Это значительно экономит для языков, в которых нет простого синтаксиса для создания и инициализации массивов.

7
ответ дан 30 November 2019 в 14:36
поделиться

Вы забываете о коде в приложении, необходимом для совершения звонка. Создание массива и его заполнение требует гораздо большего количества IL, чем просто передача 3 аргументов.

3
ответ дан 30 November 2019 в 14:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: