Почему string.Format поставляется в нескольких вариантах? - PullRequest
2 голосов
/ 10 августа 2009

.NET предоставляет четыре очень похожих версии String.Format(...) (исключая ту, которая принимает аргумент IFormatProvider):

Format(String, Object)
Заменяет один или несколько элементов формата в указанной строке строковым представлением указанного объекта.
Format(String, Object, Object)
Заменяет элемент формата в указанной строке строковыми представлениями двух указанных объектов. Format(String, Object, Object, Object)
Заменяет элементы формата в указанной строке строковым представлением трех указанных объектов. Format(String, Object[])
Заменяет элемент формата в указанной строке строковым представлением соответствующего объекта в указанном массиве.

Почему бы не использовать только аргумент (params) object[]? Есть ли прирост производительности для отдельных методов с фиксированным количеством параметров (1, 2 и 3)?
Предположительно, большинство вызовов string. Формат в реальном мире имеет 1-3 параметра.

Ответы [ 2 ]

5 голосов
/ 10 августа 2009

Это, вероятно, пережиток ранней реализации .NET Framework; если вы посмотрите * на реализации методов Format (строка, объект) , Format (строка, объект, объект) и т. д., вы увидите, что все они вызов Формат (IFormatProvider, строка, объект []) . Таким образом, абсолютно никакого выигрыша в производительности нет (если ваша сборка выполняется в режиме отладки, вызывать перегрузки объектов еще менее эффективно - не то, чтобы вы могли ее измерить).

Единственная техническая причина, которую я могу придумать, заключается в том, что эти перегрузки полезны для языков, которые не поддерживают аргументы params. В этом случае программисты могут по-прежнему вызывать String.Format («Hello {0}», «world»), а не заставлять их создавать временный массив (именно это аргументы params предлагают делать компилятору). Это также объясняет, почему существует только 3 перегрузки объекта: они покрывают 99% всех вызовов String.Format.

*) Использование рефлектора или кодовой базы устаревшего ротора.

0 голосов
/ 10 августа 2009

Да. Существует разница в производительности, связанная с созданием массива и передачей этого массива вместо простой передачи отдельных аргументов в стеке. Кроме того, поскольку .NET разработан для поддержки многих языков, возможно, они делали это для поддержки нормального синтаксиса String.Format для некоторых возможных гипотетических языков, которые не поддерживают автоматическую упаковку params параметров массива.

...