Ich habe kürzlich erfahren, dass Sie eine Methode mit unbegrenzten Parametern erstellen können, zum Beispiel:
SomeMethod(params int[] numbers);
Aber meine Frage ist, was ist der Unterschied zwischen dem und dem Erstellen einer Methode, die eine Liste oder ein Array empfängt?
SomeMethod(int[] numbers);
SomeMethod(List<int> numbers);
Vielleicht hat es einen Einfluss auf die Leistung? Ich verstehe oder sehe nicht ganz, auf welche Weise Sie die mit unbegrenzten Parametern bevorzugen würden.
Eine schnelle Suche auf Google hat nicht geholfen, ich hoffe, Sie konnten mir helfen.
params
auch erfordert die Art des Arguments ein Array zu sein. Wenn Sie eine andere Sammlung als ein Array verwenden müssen, ist es möglicherweise sinnvoller,params
stattdessen ein Nichtargument anzugeben.Console.Write
.Antworten:
Der Unterschied zwischen
und
ist, dass M so genannt werden kann:
oder so:
aber N darf nur auf die zweite Weise aufgerufen werden, nicht auf die erste .
Die Auswirkung auf die Leistung besteht darin, dass unabhängig davon, ob Sie
M
auf die erste oder die zweite Weise aufrufen, in beiden Fällen ein Array erstellt wird. Das Erstellen eines Arrays wirkt sich auf die Leistung aus, da es sowohl Zeit als auch Speicher benötigt. Denken Sie daran, dass die Auswirkungen auf die Leistung an den Leistungszielen gemessen werden sollten. Es ist unwahrscheinlich, dass die Kosten für die Erstellung eines zusätzlichen Arrays der entscheidende Faktor für Erfolg und Misserfolg auf dem Markt sind.Es ist rein und vollständig eine Annehmlichkeit für den Autor des Codes, der die Methode aufruft; es ist einfach kürzer und einfacher zu schreiben
anstatt zu schreiben
Es werden nur ein paar Tastenanschläge auf der Anruferseite gespeichert. Das ist alles.
Einige Fragen, die Sie nicht gestellt haben, die Sie aber vielleicht gerne beantworten möchten:
Methoden, mit denen eine variable Anzahl von Argumenten auf der Aufruferseite übergeben werden kann, werden als variadic bezeichnet . Mit Params-Methoden implementiert C # verschiedene Methoden.
Bei einem Problem mit der Überlastungsauflösung berücksichtigt C # sowohl das "normale" als auch das "erweiterte" Formular, und das "normale" Formular gewinnt immer, wenn beide zutreffen. Betrachten Sie zum Beispiel Folgendes:
und wir haben einen Anruf
Es gibt zwei anwendbare Möglichkeiten. In "normaler" Form rufen wir
P
eine Nullreferenz für das Array auf und übergeben sie. In "erweiterter" Form nennen wirP(new object[] { null })
. In diesem Fall gewinnt die normale Form. Wenn wir einen Anruf hatten,P(null, null)
ist das normale Formular nicht anwendbar und das erweiterte Formular gewinnt standardmäßig.Herausforderung : Nehmen wir an, wir haben
var s = new[] { "hello" };
einen AnrufP(s);
. Beschreiben Sie, was an der Anrufstelle passiert und warum. Sie könnten überrascht sein!Herausforderung : Angenommen, wir haben beide
void P(object x){}
undvoid P(params object[] x){}
. Was machtP(null)
und warum?Herausforderung : Angenommen, wir haben beide
void M(string x){}
undvoid M(params string[] x){}
. Was machtM(null)
und warum? Wie unterscheidet sich das vom vorherigen Fall?quelle
P(null)
vs.P((object)null)
vs.P((object[])null)
- wo finde ich eine Erklärung für diesen Unterschied? Es fühlt sich an, alsnull
hätte es einen speziellen Typ , der eher in Array als in object (P(null)
) konvertiert , aber die Konvertierung in einen String oder ein Array von Strings mehrdeutig findet (M(null)
) ... was sich sehr seltsam anfühlt, würde erwarten, dass er entweder in beiden Fällen mehrdeutig ist oder auswählt die Single-Arg-Version (was es nicht tut). Aber ich denke, es geht mehr darumparams
, irgendwie generisch zu sein , wie Universal Reference (&&
) in C ++ - Vorlagen, und daher besser übereinzustimmen (in Ch2, nicht in Ch3).object[]
sindobject
, aber nicht alleobject
sindobject[]
, ist daherobject[]
spezifischer.string[]
sindstring
". In der Tat NOstring[]
sindstring
und NOstring
sindstring[]
, sostring
ist nicht spezifischere oder allgemeiner alsstring[]
, und wir bekommen eine Fehler Mehrdeutigkeit , wenn wählen gefragt.object[]
sindobject
...object[]
ist spezifischer, alsoP(null)
gilt das spezifischere Array, danke, das hat mir gefehlt. Hier finden Sie einige Regeln: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…Habe gerade einen kleinen Prototyp gemacht. Die Antwort scheint zu sein, dass
params
es sich einfach um syntaktischen Zucker zum Übergeben eines Arrays handelt. Das ist keine wirkliche Überraschung. Ich habe zwei Versionen derselben Methode erstellt, wobei der einzige Unterschied das Schlüsselwort "params" ist. Die für beide generierte IL war identisch, außer dass aSystem.ParamArrayAttribute
auf dieparams
Version angewendet wurde .Außerdem war die an der Aufrufstelle generierte IL zwischen dem Aufrufen der Methode mit einer manuell deklarierten
new int[]
Methode und dem Aufrufen der Methode nur unter Verwendung derparams
Argumente dieselbe .Die Antwort scheint also "Bequemlichkeit" zu sein. Es scheint keinen Leistungsunterschied zu geben. Sie können
params
stattdessen auch eine Funktion mit einem Array aufrufen , was auch nicht sonderlich überraschend ist. Es kommt darauf an, ob es für den Verbraucher Ihrer Methode einfacher ist, sie mit einer beliebigen Anzahl von Parametern aufzurufen (z. B.someMethod(1, 2, 3)
), als immer zuerst eine Sammlung erstellen zu müssen (zsomeMethod(new List<int>() { 1, 2, 3 } )
. B. ).quelle
Die Funktion unbegrenzter Parameter bietet in vielen Szenarien die folgenden Vorteile:
Hier ist ein Beispiel, bei dem die Option für unbegrenzte Parameter eine gute Wahl ist
Beachten Sie, dass eine Anwendung zum Senden von E-Mails erstellt werden muss.
Die Funktion, die die E-Mail sendet, muss entweder einzelne oder mehrere Werte für die Felder "An", "CC" und "BCC" verarbeiten können.
Wenn die Parametertypen als Arrays oder Listen für alle Felder (To, CC, BCC) festgelegt sind, muss sich die aufrufende Funktion mit der Komplexität der Definition von 3 Arrays oder Listen befassen, um die E-Mail-Absenderfunktion aufzurufen .
Selbst wenn der Anrufer eine E-Mail an nur eine Adresse senden möchte, zwingt die E-Mail-Absenderfunktion den Anrufer, 3 verschiedene Arrays als Parameter zu definieren und zu senden.
Wenn die E-Mail-Absenderfunktion den unbegrenzten Parameteransatz verwendet, muss die Anruferfunktion nicht die gesamte Komplexität bewältigen.
Der Ansatz mit unbegrenzten Parametern trägt zu einer besseren Laufzeitleistung der Anwendung bei, indem die Erstellung von Arrays oder Listen vermieden wird, wo immer dies nicht erforderlich ist.
quelle
Aus einer nicht leistungsfähigen Stilperspektive ist das
params
Schlüsselwort sehr hilfreich, wenn Sie eine optionale Liste von Parametern senden möchten.Persönlich würde ich verwenden,
params
wenn mein Code so etwas wie warDas Schöne daran ist, dass ich diese Methode überall anwenden kann, ohne jedes Mal ein Array oder eine Liste erstellen zu müssen.
Ich würde verwenden
array
oderlist
wenn ich weiß, werde ich dieser Funktion immer einen Datensatz übergeben, der bereits wie zusammengestellt istIch sehe den Vorteil
params
in der Flexibilität, die es hinzufügt. Es mag eine relativ geringe Auswirkung auf Ihren Code haben, aber es ist immer noch ein gutes Werkzeug.quelle
Die Aufrufkonvention ist anders. Beispielsweise ...
Im ersten Fall können Sie so viele Ints wie separate Parameter an die Methode übergeben. Im zweiten Fall müssten Sie eine Liste instanziieren und übergeben.
quelle