Domanda

usavo Reflector di guardare l'attuazione di String.Format e avevo sempre avuto l'impressione che i sovraccarichi di String.Format che hanno 1, 2 e 3 argomenti sono stati ottimizzati versioni del metodo che accetta una matrice di oggetti. Tuttavia, ciò che ho trovato è che internamente creano un array oggetto e quindi chiamare un metodo che accetta un array oggetto.

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

array oggetto

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 tutti finiscono con lo stesso codice e quindi utilizzando le versioni 1, 2 & 3 argomento non più veloce della versione oggetto array sono.

Quindi la mia domanda è -? perché essi esistono

Quando si utilizza la versione oggetto matrice con un elenco separato di valori, il compilatore converte automaticamente i parametri in un array oggetto a causa delle params / ParamArray parola che è essenzialmente quello delle versioni 1, 2 e 3 fanno, in modo che sembrare ridondante. Perché i progettisti BCL aggiungono questi sovraccarichi?

È stato utile?

Soluzione

Una ragione, come ricorda Hans, è che la creazione di un array è un sacco di inutile sovraccarico nella maggior parte dei casi più comuni di formattazione di una stringa. Ciò consente di risparmiare spazio nel file EXE.

Un altro motivo è che non tutti i linguaggi supportano le funzioni variadic (uso di params in C #). Questo permette agli utenti di queste lingue per evitare la creazione di array per i casi più comuni di formattazione delle stringhe. Questo fa risparmiare un sacco per le lingue che non hanno sintassi semplice per la creazione di array e l'inizializzazione.

Altri suggerimenti

Si sta dimenticando il codice in app richiesto per effettuare la chiamata. Creare la matrice e il riempimento ci vuole molto di più di solo di passaggio IL 3 args.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top