C # Variable Länge args, was ist besser und warum: __arglist, params array oder DictionaryT, K?

8

Ich habe vor kurzem folgenden Überlauf gelesen: versteckte Funktionen von C #

Eines der Features, auf das hingewiesen wurde, war die Argliste. Warum sollte man diese oder die Alternativen wählen, um eine Argumentliste mit variabler Länge für eine Methode zu verwenden? Beachten Sie auch, dass ich diese Art von Konstrukt wahrscheinlich nicht in meinem Code verwenden würde, es sei denn, ein Eckfall würde dies rechtfertigen. Dies ist eher eine Frage der Semantik, als ob es sogar praktisch oder klug ist, Argumente mit variabler Länge zu verwenden. Also weiß jemand, was besser ist und warum?

%Vor%     
mkelley33 26.05.2009, 13:09
quelle

5 Antworten

8

Ich würde sicherlich niemals __arglist verwenden, da es undokumentiert ist und niemand weiß, was es auf jeden Fall bedeutet.

Ich würde auch Argumentlisten mit variabler Länge so lange wie möglich vermeiden und stattdessen meinen Entwurf überarbeiten, um zu verstehen, was wirklich variabel ist, und diese Variabilität in einer weniger plattformabhängigen Weise zu modellieren.

    
John Saunders 26.05.2009, 13:18
quelle
4

C # 4 wird dafür einen besseren Mechanismus haben; benannte und optionale Argumente :

%Vor%     
bzlm 26.05.2009 14:13
quelle
3

Es kommt auf den Fall an. Ich habe params in Fällen verwendet, in denen ich eine variable Anzahl von Argumenten habe und es erheblich zur Lesbarkeit des aufrufenden Codes beiträgt.

Ich habe beispielsweise eine Klasse, die ein TIFF-Dokument darstellt und Zugriff auf eine Sammlung von Seiten ermöglicht, die neu angeordnet und mit anderen TIFF-Dokumenten vermischt werden können. Da eine der häufigsten Aufgaben unserer Kunden die Möglichkeit ist, mehrere TIFF-Dokumente zu einer einzigen zu kombinieren, bieten wir auch die folgenden zwei Hilfsmethoden:

%Vor%

was den Client-Code bei der Benutzung sehr angenehm macht:

%Vor%     
plinth 26.05.2009 14:03
quelle
3

Im Allgemeinen sind Sie wahrscheinlich besser dran, undokumentierte Merkmale der Sprache zu vermeiden - aus verschiedenen Gründen.

  • Es ist wahrscheinlicher, dass sie die etablierten, dokumentierten Funktionen ändern
  • Sie können Nebenwirkungen und Auswirkungen haben, die in ihrer Verwendung nicht offensichtlich sind
  • Andere Entwickler werden sich mit ihnen nicht auskennen und werden es schwerer haben, Ihren Code zu pflegen
  • Refactoring-Tools (wie VS selbst oder Resharper ) sind wahrscheinlich nicht in der Lage, sie zu erkennen
  • Sie entfernen Klarheit aus der Absicht Ihres Codes
  • Es gibt sprachgestützte Alternativen zu den meisten von ihnen

Im speziellen Fall der __arglist können Sie die gleichen Fähigkeiten mit der unterstützten Sprache params , mit dem Sie typsichere Variablenargumentlisten für Methoden in C # erstellen können. Als Praxis würde ich jedoch vorsichtig damit umgehen, da es Ihren Code bei unveränderter Verwendung verschleiern kann - gute Anwendungsfälle (wie die in string.Format (), die variable Argumente akzeptieren) - sind weniger häufig, als Sie denken würden.

    
LBushkin 26.05.2009 14:07
quelle
0

Ich würde es vorziehen, keine der drei hier beschriebenen Techniken zu verwenden. Ich würde stattdessen ein Wertobjekt entwerfen, das wo immer möglich starke Typen und möglicherweise sogar NULL-Typen hat. Wenn es hart auf hart kommt, können Sie auch ein generisch typisiertes Wertobjekt erstellen.

Es gibt einfach so viel Code, der auf diese Weise für mich kodiert. Eine variable Länge Sammlung von Objekt ? Wäre nicht unbemerkt in mein Code-Review.

Bearbeiten : Und wenn es meine Codeüberprüfung übergeben würde, wäre der Parameter höchstwahrscheinlich eine IEnumerable-Instanz und keiner der drei Vorschläge. IEnumerable ist die schlankste Sache, die meine Bedürfnisse kapseln könnte.

    
krosenvold 26.05.2009 13:21
quelle

Tags und Links