Perché i sovraccarichi di String.Format esistono?
-
04-10-2019 - |
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?
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.