Подтвердить что ты не робот

Почему существуют перегрузки String.Format?

Я использую отражатель, чтобы посмотреть на реализацию 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 добавили эти перегрузки?

4b9b3361

Ответ 1

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

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

Ответ 2

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