2009-08-09 10 views
1

.NET stellt vier sehr ähnliche Versionen String.Format(...) (mit Ausnahme des einen, der ein Argument nimmt IFormatProvider):Warum kommt string.Format in verschiedenen Geschmacksrichtungen?

Format(String, Object)
Ersetzt ein oder mehr Formate Elemente in einer bestimmten Zeichenfolge mit der String-Darstellung eines bestimmten Objekts.
Format(String, Object, Object)
Ersetzt das Formatelement in einer angegebenen Zeichenfolge durch die Zeichenfolgendarstellungen von zwei angegebenen Objekten. Format(String, Object, Object, Object)
Ersetzt die Formatelemente in einer angegebenen Zeichenfolge durch die Zeichenfolgendarstellung von drei angegebenen Objekten. Format(String, Object[])
Ersetzt das Formatelement in einer angegebenen Zeichenfolge durch die Zeichenfolgendarstellung eines entsprechenden Objekts in einem angegebenen Array.

Warum haben Sie nicht gerade die mit einem (params) object[] Argument? Gibt es einen Leistungsgewinn für separate Methoden mit einer festen Anzahl von Parametern (1, 2 und 3)?
Vermutlich haben die meisten Aufrufe von String.Format in der realen Welt 1-3 Parameter.

+1

Es gibt eine Params-Überladung: 'public static string Format (string format, params object [] args);' –

+0

Das meinte ich mit 'Warum nicht nur eines mit einem params object [] argument?' ... Ich werde es aufräumen. –

+0

Mein Punkt war, warum sind die anderen drei Versionen dort? –

Antwort

4

Es ist wahrscheinlich ein Relikt aus einer frühen Implementierung von .NET Framework; Wenn Sie * auf die Implementierungen des Format (string, object), Format (string, object, object), etc. Methoden schauen, werden Sie sehen, dass sie alle rufen Format (IFormatProvider, String, Objekt []). Es gibt also absolut keinen Leistungsvorteil (wenn Ihr Build im Debug-Modus ausgeführt wird, ist es noch weniger effizient, die Objektüberlastungen aufzurufen - nicht, dass Sie es messen können).

Der einzige technische Grund, den ich mir vorstellen kann, ist, dass diese Überladungen nützlich für Sprachen sind, die Params- Argumente nicht unterstützen. In diesem Fall können Programmierer weiterhin String.Format ("Hello {0}", "world") aufrufen, anstatt sie dazu zu zwingen, ein temp-Array zu erstellen (was param-Argumente den Compiler vorschlagen). Das erklärt auch, warum es nur 3 Objektüberladungen gibt: Diese decken 99% aller String.Format-Aufrufe ab.

*) Mit Reflektor oder der datierten Rotor-Codebasis.

1

Ja. Es gibt einen Leistungsunterschied, der damit verbunden ist, ein Array zu erstellen und dieses zu übergeben, anstatt einfach einzelne Argumente auf dem Stack zu übergeben. Da .NET viele Sprachen unterstützt, haben sie möglicherweise die normale Syntax String.Format für eine mögliche hypothetische Sprache unterstützt, die das automatische Packen von params Array-Parametern nicht unterstützt.

+0

Wenn Leistung ein Problem ist, warum verwenden Sie sogar String.Format? – Zyphrax

+0

Gut. Wenn Sie die Funktion "String.Format" selbst schreiben würden, hätten Sie vielleicht nicht darauf geachtet, aber Microsoft erstellt ein Framework, das in vielen Situationen verwendet wird. Es ist sinnvoll, dass sie aus jedem Prozessorzyklus das Beste herausholen. –