Pregunta

Estaba usando reflector para ver la implementación de String.Format y siempre tenía la impresión de que las sobrecargas de String.format que tomaban 1, 2 y 3 argumentos 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 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 });
}

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, usando las versiones de 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 usa la versión de matriz de objetos con una lista de valores separada 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?

¿Fue útil?

Solución

Una razón, como Hans menciona, es que crear una matriz es una gran cantidad innecesaria en la mayoría de los casos comunes de formateo de una cadena. Esto ahorra espacio en el exe.

Otra razón es que no todos los idiomas admiten funciones variádicas (uso de params Cía#). Esto permite a los usuarios de esos idiomas evitar la creación de matriz para los casos más comunes de formato de cadena. Esto ahorra mucho para idiomas que no tienen sintaxis simple para la creación de matriz y la inicialización.

Otros consejos

Se olvida del código en la aplicación requerida para hacer la llamada. Crear la matriz y el llenado Se necesita mucho más IL que solo pasar 3 args.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top