Frage

Ich habe Reflektor verwendet, um die Implementierung von String.Format zu betrachten, und hatte immer den Eindruck, dass die Überladungen von String.Format, bei dem 1, 2 und 3 Argumente dauerten, optimierte Versionen der Methode waren, die ein Objektarray einnimmt. Was ich jedoch fand, war, dass sie intern ein Objektarray erstellen und dann eine Methode aufrufen, die ein Objektarray annimmt.

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

Objektarray

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

Intern verwenden alle denselben Code und so sind die Verwendung der Argumentversionen 1, 2 und 3 nicht schneller als die Objektarray -Version.

Meine Frage ist also - - Warum existieren sie?

Wenn Sie die Objektarray -Version mit einer von der Kommas getrennten Werteliste verwenden, wandelt der Compiler die Argumente automatisch in ein Objektarray um, da das Schlüsselwort Params/Paramarray im Wesentlichen das ist, was die 1-, 2- und 3 -Versionen tun, sodass sie überflüssig erscheinen. Warum haben die BCL -Designer diese Überladungen hinzugefügt?

War es hilfreich?

Lösung

Ein Grund, wie Hans erwähnt, ist, dass das Erstellen eines Arrays in den meisten häufigen Fällen der Formatierung einer Zeichenfolge eine Menge unnötiger Gemeinkosten ist. Dies spart Platz in der Exe.

Ein weiterer Grund ist, dass nicht alle Sprachen variadische Funktionen unterstützen (Verwendung von params in C#). Auf diese Weise können Benutzer dieser Sprachen eine Array -Erstellung für die häufigsten Fälle von String -Formatierung vermeiden. Dies spart viel für Sprachen, die keine einfache Syntax für die Erstellung und Initialisierung von Array haben.

Andere Tipps

Sie vergessen den Code in der App, die erforderlich ist, um den Anruf zu tätigen. Das Erstellen des Arrays und das Füllen erfordert viel mehr IL als nur 3 Argumente.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top