Warum definieren Methoden mit einer unbegrenzten Anzahl von Parametern häufig Überladungen mit weniger Parametern?

36

Beispielsweise weist die System.IO.Path.CombineMethode in .NET die folgenden Überladungen auf:

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

Was ist der Sinn der letzten drei?

Die erste würde sie alle abdecken, als ob Sie genau hinschauen, verwendet es das paramsSchlüsselwort. Das Argument der Abwärtskompatibilität würde nur die Combine(String, String)Variante abdecken , da es die einzige Version bis .NET 4 war.

Alex
quelle

Antworten:

56

Der Hauptgrund ist für die Leistung. Der syntaktische Zucker "Unbegrenzte Argumente" besteht eigentlich aus einer Reihe von Zeichenfolgen. Wenn Sie nur eine Zeichenfolge übergeben, warum erstellen Sie ein Array mit nur einer Zeichenfolge? Insbesondere wenn ~ 90% der Aufrufe dieser Methode mit 3 oder weniger Argumenten ausgeführt werden, ist das Array-Objekt mit dem höheren Gewicht nicht erforderlich. Der Arbeitsspeicher ist etwas kleiner und die Verarbeitungszeit etwas kürzer, da zum Definieren der Methode keine Schleife erforderlich ist. Wenn Sie drei Zeichenfolgen haben, codieren Sie nur drei Zeichenfolgen.

Greg Burghardt
quelle
Es ist auch zu beachten, dass das Übergeben Combinemit null oder einem Pfadsegment nicht einmal sinnvoll ist, die paramsVersion ermöglicht dies jedoch.
Matthew
4
Der Grund für die Anzahl der Überladungen , die unterschiedliche Anzahlen von Argumenten akzeptieren, liegt nicht in der Lesbarkeit. Dies dient der Leistung aufgrund des Overheads, der durch das Generieren eines Arrays von Zeichenfolgen und deren anschließende Verarbeitung entsteht. Der Grund für die Annahme params string[]ist die Lesbarkeit.
Greg Burghardt
2
Leistung ist in der Tat der Grund, und ich glaube, es ist speziell für, wenn erwartet wird, dass eine Funktion aus inneren Schleifen aufgerufen wird . In Brad Abrams 'Anmerkung auf Seite 27 der C # -Programmiersprache, Third Edition, heißt es: "[D] Das C # -Modell erstellt implizit bei jedem Aufruf eine zusätzliche Objektzuordnung (das enthaltende Array). Dies ist selten ein Problem, aber innerlich -szenarien vom Typ "Schleife", in denen es ineffizient werden könnte, empfehlen wir, Überladungen für die Mainstream-Fälle bereitzustellen und die paramsÜberladung nur für die Edge-Fälle zu verwenden. Ein Beispiel ist die StringBuilder.AppendFormat()Familie der Überladungen. "
Eliah Kagan
3
@LowFlyingPelican Mono und .NET Framework sind nicht dasselbe. Wenn Sie sich die .NET Framework-Version ansehen , handelt es sich tatsächlich um eine ganz andere Lösung.
Alex
3
@LowFlyingPelican: Der Grund für .NET Framework ist die Leistung. Monos Grund für die Implementierung dieser Methode war die API-Kompatibilität mit .NET. Monos Grund für die Implementierung dieser Methode war die Einfachheit der Implementierung (da sie erheblich weniger Ressourcen als Microsoft haben).
5.
4

Syntethischer Zucker.

Bei der Manipulation von Dateipfaden ist es sehr häufig, dass nur wenige feste Werte vorhanden sind. In diesen Fällen ist es bequemer, sie direkt zu verwenden, als sie in ein Array packen zu müssen.

Gort den Roboter
quelle
3
Mit params suggerieren Sie es bereits. msdn.microsoft.com/en-us/library/w5zay9db.aspx Kein Array erforderlich.
Thomas Junk
3
In C # haben Sie einen Punkt, @Thomas. .NET unterstützt jedoch auch andere Sprachen ohne params.
Karl Bielefeldt
@ThomasJunk Dieser Link ist leider für mich tot, aber ich bin mir sicher, dass Sie Recht haben, da mein C # mittelmäßig ist. Ich habe gerade viele Bibliotheken mit vielen Sprachen gesehen, die das tun, nur um saubereren Code zu ermöglichen.
Gort the Robot