with net money .net string.format bcl

.net - net - ¿Por qué existen las sobrecargas de String.Format?



string with format java (2)

Se está olvidando del código requerido en la aplicación para realizar la llamada. Crear la matriz y llenarlo requiere mucho más IL que solo pasar 3 argumentos.

Estaba usando Reflector para ver la implementación de String.Format y siempre tuve la impresión de que las sobrecargas de String.Format que tomaron los argumentos 1, 2 y 3 eran versiones optimizadas del método que toma una matriz de objetos. Sin embargo, lo que encontré fue que internamente crean una matriz de objetos y luego llaman a un método que toma una matriz de objetos.

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 argumentos

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 argumentos

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 }); }

Matriz de objetos

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); }

Internamente, todos terminan usando el mismo código y, por lo tanto, las versiones de los argumentos 1, 2 y 3 no son más rápidas que la versión de matriz de objetos.

Entonces mi pregunta es: ¿por qué existen?

Cuando utiliza la versión de matriz de objetos con una lista de valores separados por comas, el compilador convierte automáticamente los argumentos en una matriz de objetos debido a la palabra clave params / ParamArray, que es esencialmente lo que hacen las versiones 1, 2 y 3, por lo que parecen redundantes. ¿Por qué los diseñadores de BCL agregaron estas sobrecargas?


Una de las razones, como menciona Hans, es que la creación de una matriz supone una sobrecarga innecesaria en la mayoría de los casos comunes de formato de una cadena. Esto ahorra espacio en el EXE.

Otra razón es que no todos los idiomas admiten funciones variables (uso de params en C #). Esto permite a los usuarios de esos idiomas evitar la creación de matrices para los casos más comunes de formato de cadenas. Esto ahorra mucho para los idiomas que no tienen una sintaxis simple para la creación e inicialización de la matriz.