Вопрос

Я использовал отражатель, чтобы посмотреть на реализацию string.format и всегда находился под впечатлением, что перегрузки string.format, которые взяли 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 / Parmarray, который по существу, что делает версии 1, 2 & 3, поэтому они кажутся избыточными. Почему дизайнеры BCL добавляют эти перегрузки?

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top