Почему существуют перегрузки string.format?
-
04-10-2019 - |
Вопрос
Я использовал отражатель, чтобы посмотреть на реализацию 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.