Vom Leistung Perspektive, wie Sie sind Fragen, die params-rufen Sie einfach schneller, weil es ist ein bisschen schneller, ein array zu erstellen, als es zu dem erstellen einer List<>. Es gibt keine performance-Unterschied zwischen den beiden snippets oben.
Ich persönlich verwende params beim schreiben von Funktionen, die eine Anzahl von Eingängen zur Verfügung gestellt von ein anderer Programmierer (zum Beispiel String.Format), und IEnumerable beim schreiben von Funktionen, die eine Liste von Datenelementen zur Verfügung gestellt von die computer (zum Beispiel File.Write).
Die Auswirkungen auf die Leistung zu vernachlässigen sind. Sich Gedanken über die Leistung einer trivialen Sache wie diese ist genau was Donald Knuth spricht in der berühmten "vorzeitige Optimierung ist die Wurzel allen übels" zu zitieren.
Sagte, die Fragesteller zu sein scheint fixiert auf Sie, so hier gehen Sie:
Ergebnisse für 10 Millionen Iterationen:
params took 308 ms
list took 879 ms
Aus diesen Ergebnissen können wir sehen, dass die params-array ist nur mehr als doppelt so schnell. Die einfache Tatsache, dass Sie können, rufen Sie entweder diese Dinge Zehn Millionen Mal in unter einer Sekunde bedeutet, dass Sie komplett Ihre Zeit verschwenden, indem Sie sich Gedanken über es. Verwenden Sie, was passt zu Ihrem code die besten.
Den code zu testen (kompiliert und ausgeführt im release-Modus mit VS2008)
classProgram{constint COUNT =10000000;staticIEnumerable<string> m_value =null;staticvoidParamsMethod(paramsstring[] args){ m_value = args;}//do something with it to stop the compiler just optimizing this method awaystaticvoidListMethod(List<string> args){ m_value = args;}//do SOMETHING with it to stop the compiler just optimizing this method awaystaticvoidMain(string[] args){var s =newStopwatch();
s.Start();for(int i =0; i < COUNT;++i)ParamsMethod("a","b","c");Console.WriteLine("params took {0} ms", s.ElapsedMilliseconds);
s.Reset();
s.Start();for(int i =0; i < COUNT;++i)ListMethod(newList<string>{"a","b","c"});Console.WriteLine("list took {0} ms", s.ElapsedMilliseconds);}}
Gut, die params ermöglicht eine schönere syntax beim Aufruf, aber die Liste ist (vorausgesetzt, du meinst IList<>) ist flexibler, da verschiedene Klassen die das interface implementieren. Die übergabe eines List<> macht nur Sinn, wenn Sie brauchen, um bestimmte Operationen auf der Liste, die nicht unterstützt werden von der Schnittstelle (wie ToArray()).
Den params-Schlüsselwort ermöglicht es Ihnen, dynamisch übergeben Sie eine variable Anzahl an Argumenten an die Funktion, ohne sich Gedanken über compiler-Fehler wie dieser:
Wenn Sie übergeben eine Liste, müssen Sie zum erstellen der Liste, bevor Sie Sie übergeben können, in:
publicstringPrefixFormatString(string p,string s,List<object> par){return p +string.Format(s, par.ToArray());}...List<object> l =newList<object>(newobject[]{ errNum, errStr });PrefixFormatString("COM","Output Error #{0} - Error = {1}", l);
neigt er zum ausblenden der Bedeutung, welche Art von Daten die Funktion erwartet wird.
Beachten Sie, dass dies ist sehr ähnlich der übergabe von einer einfachen array-Variablen. Der einzige Unterschied ist, dass der compiler reparieren, die Parameter in ein array für Sie... ich bin mir nicht 100% sicher, aber ich denke der technische Unterschied ist nur syntaktischer Zucker - in jedem Fall sind Sie wirklich ein array übergeben, von welchem Typ der parameter ist.
params ist ein sprachkonstrukt für die Funktionen nehmen eine variable Anzahl von Parametern. Es ist ähnlich zu C durch Anwahl des Buttons " Planer - also printf(char* fmt, ...). Die Sprache unterstützt diese Art der operation, könnte genauso gut verwenden Sie es, vor allem, wenn es macht den code leichter zu Lesen.
Der wesentliche Unterschied zwischen den beiden, die ich sehen kann, ist, dass die Anzahl der übergebenen Parameter in der Methode festgelegt zur compile-Zeit mit params, während mit einem List<T> kommt es auf die Liste übergeben, in der zur Laufzeit.
Ob die Festsetzung der Anzahl der Argumente, der Methode muss aufgerufen werden, mit zur compile-Zeit ist ein Profi oder ein con, richtet sich ganz nach Ihren design und Absicht. Entweder kann ein Vorteil sein-je nachdem, was Sie hoffen, zu erreichen.
Params hilft der Lesbarkeit vor, und ist so nah an einem optionalen parameter, die Sie gehen zu bekommen, um in C#. Ich würde nur verwenden Sie die List<T> Umsetzung persönlich, wenn ich brauchte, um zu konsumieren, und eine unbekannte Zahl von Parametern zu jedem Punkt.
Edit: gerade entdeckt deine Bearbeitung über performance-Probleme. Auf das Thema bin ich unsicher, obwohl, wenn Sie könnten erwarten, dass eine große Anzahl von 'Parameter' mit List<T>, in der Erwägung, dass params hat eine Vernunft Kappe drauf wegen Ihnen müssen codiert werden.
Den params-Schlüsselwort ist syntaktischer Zucker behandelt, die vom C# - compiler. unter der Haube sind, ist es eigentlich drehen
in
Vom Leistung Perspektive, wie Sie sind Fragen, die params-rufen Sie einfach schneller, weil es ist ein bisschen schneller, ein array zu erstellen, als es zu dem erstellen einer List<>. Es gibt keine performance-Unterschied zwischen den beiden snippets oben.
InformationsquelleAutor der Antwort Jimmy
Ich persönlich verwende
params
beim schreiben von Funktionen, die eine Anzahl von Eingängen zur Verfügung gestellt von ein anderer Programmierer (zum BeispielString.Format
), undIEnumerable
beim schreiben von Funktionen, die eine Liste von Datenelementen zur Verfügung gestellt von die computer (zum BeispielFile.Write
).Die Auswirkungen auf die Leistung zu vernachlässigen sind. Sich Gedanken über die Leistung einer trivialen Sache wie diese ist genau was Donald Knuth spricht in der berühmten "vorzeitige Optimierung ist die Wurzel allen übels" zu zitieren.
Sagte, die Fragesteller zu sein scheint fixiert auf Sie, so hier gehen Sie:
Ergebnisse für 10 Millionen Iterationen:
Aus diesen Ergebnissen können wir sehen, dass die params-array ist nur mehr als doppelt so schnell. Die einfache Tatsache, dass Sie können, rufen Sie entweder diese Dinge Zehn Millionen Mal in unter einer Sekunde bedeutet, dass Sie komplett Ihre Zeit verschwenden, indem Sie sich Gedanken über es. Verwenden Sie, was passt zu Ihrem code die besten.
Den code zu testen (kompiliert und ausgeführt im release-Modus mit VS2008)
InformationsquelleAutor der Antwort Orion Edwards
Gut, die
params
ermöglicht eine schönere syntax beim Aufruf, aber die Liste ist (vorausgesetzt, du meinstIList<>
) ist flexibler, da verschiedene Klassen die das interface implementieren. Die übergabe einesList<>
macht nur Sinn, wenn Sie brauchen, um bestimmte Operationen auf der Liste, die nicht unterstützt werden von der Schnittstelle (wieToArray()
).InformationsquelleAutor der Antwort Lucero
Den params-Schlüsselwort ermöglicht es Ihnen, dynamisch übergeben Sie eine variable Anzahl an Argumenten an die Funktion, ohne sich Gedanken über compiler-Fehler wie dieser:
Wenn Sie übergeben eine Liste, müssen Sie zum erstellen der Liste, bevor Sie Sie übergeben können, in:
neigt er zum ausblenden der Bedeutung, welche Art von Daten die Funktion erwartet wird.
Beachten Sie, dass dies ist sehr ähnlich der übergabe von einer einfachen array-Variablen. Der einzige Unterschied ist, dass der compiler reparieren, die Parameter in ein array für Sie... ich bin mir nicht 100% sicher, aber ich denke der technische Unterschied ist nur syntaktischer Zucker - in jedem Fall sind Sie wirklich ein array übergeben, von welchem Typ der parameter ist.
InformationsquelleAutor der Antwort Michael Bray
Tja, das mit dem params-Schlüsselwort, das Sie geben könnte-Argumente in eine Methode wie diese:
Aber mit einer Liste, die Sie würde es so machen:
Kann die syntax ein wenig klarer in der ehemaligen als die letzteren. Dies ist nützlich, wenn Sie nur einen parameter zu übergeben:
InformationsquelleAutor der Antwort Scott
params
ist ein sprachkonstrukt für die Funktionen nehmen eine variable Anzahl von Parametern. Es ist ähnlich zu C durch Anwahl des Buttons " Planer - alsoprintf(char* fmt, ...)
. Die Sprache unterstützt diese Art der operation, könnte genauso gut verwenden Sie es, vor allem, wenn es macht den code leichter zu Lesen.InformationsquelleAutor der Antwort Igor Zevaka
Persönlich würde ich überspringen Sie die params. Ich habe gebissen worden, indem Sie es einmal oder zweimal. Wie? Lassen Sie mich erklären.
Schreiben Sie eine öffentliche Methode mit der folgenden Signatur:
Testen Sie es, es funktioniert, fertig... und eine weitere Montage/Anwendung aufrufen der Funktion.
Nun, einen Monat später, die Sie wollen, ändern Sie Ihre Signatur hinzufügen von Benutzer-Rolle:
Oh, wie sich die Dinge geändert haben, für alles, was den Aufruf Ihrer Methode.
InformationsquelleAutor der Antwort Kris Krause
Der wesentliche Unterschied zwischen den beiden, die ich sehen kann, ist, dass die Anzahl der übergebenen Parameter in der Methode festgelegt zur compile-Zeit mit
params
, während mit einemList<T>
kommt es auf die Liste übergeben, in der zur Laufzeit.Ob die Festsetzung der Anzahl der Argumente, der Methode muss aufgerufen werden, mit zur compile-Zeit ist ein Profi oder ein con, richtet sich ganz nach Ihren design und Absicht. Entweder kann ein Vorteil sein-je nachdem, was Sie hoffen, zu erreichen.
Params
hilft der Lesbarkeit vor, und ist so nah an einem optionalen parameter, die Sie gehen zu bekommen, um in C#. Ich würde nur verwenden Sie dieList<T>
Umsetzung persönlich, wenn ich brauchte, um zu konsumieren, und eine unbekannte Zahl von Parametern zu jedem Punkt.Edit: gerade entdeckt deine Bearbeitung über performance-Probleme. Auf das Thema bin ich unsicher, obwohl, wenn Sie könnten erwarten, dass eine große Anzahl von 'Parameter' mit
List<T>
, in der Erwägung, dassparams
hat eine Vernunft Kappe drauf wegen Ihnen müssen codiert werden.InformationsquelleAutor der Antwort Joe Lloyd
Die Leistung der Programmierer Aufruf Ihrer Methode kann manchmal verbessert werden, indem Sie Ihre Verwendungen des params-Schlüsselwort.
(Vorausgesetzt, dass der Programmierer Kosten so viel mehr als Computer, warum denken Sie, jede andere Art von Leistung.)
InformationsquelleAutor der Antwort Ian Ringrose