C# - variable Länge args, was ist besser und warum: __arglist, params array oder ein Dictionary<T,K>?
Kürzlich Las ich folgenden post-überlauf:
Versteckte Features von C#
Eines der Merkmale wies darauf hin wurde der arglist. Warum sollte man dieses wählen oder die alternativen, die als Mittel mit einer Variablen Länge der Argumentliste einer Methode? Beachten Sie auch, dass ich wahrscheinlich würde nicht verwenden, diese Art von konstruieren in meinem code, es sei denn, eine Ecke Fall gerechtfertigt, dies zu tun. Dies ist mehr eine Frage der Semantik, als ob es auch praktisch ist, oder klug, sogar mit variabler Länge Argumente. Also weiß jemand, welche besser ist und warum?
[Test]
public void CanHandleVariableLengthArgs()
{
TakeVariableLengthArgs(__arglist(new StringBuilder(), 12));
object[] arr = { new StringBuilder() };
TakeVariableLengthArgs2(arr);
TakeVariableLengthArgs3(
new Dictionary<string, object>
{ { "key", new StringBuilder() } });
}
public void TakeVariableLengthArgs(__arglist)
{
var args = new ArgIterator(__arglist);
var a = (StringBuilder)TypedReference.ToObject(args.GetNextArg());
a.Append(1);
}
public void TakeVariableLengthArgs2(params object[] args)
{
var a = (StringBuilder)args[0];
a.Append(1);
}
public void TakeVariableLengthArgs3(Dictionary<string, object> args)
{
var a = (StringBuilder)args["StringBuilder"];
a.Append(1);
}
- Die Sohle durch-design Zweck __arglist-ist, so dass Sie können sicher tun interop-Anrufe zu und von Bibliotheken in C++ geschrieben, die Verwendung von C-Stil-var args. Verwenden Sie es nicht für nichts.
- Wenn Sie möchten, um pinvoke wsprintf-Funktion, Sie gotta verwenden
__arglist
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hätte ich sicherlich nie verwenden __arglist, da es nicht dokumentiert und keiner weiß, was es bedeutet in jedem Fall.
Ich würde auch vermeiden, variable-length argument lists für so lange wie möglich, und statt Nacharbeit mein design, um zu verstehen, was wirklich variabel, und das Modell, dass die Variabilität in einer weniger Plattform-abhängigen Weise.
params
ist schlechtes design? Was?C# 4 wird eine bessere Mechanismus für diese; benannte und optionale Argumente:
Es hängt von der Fall. Ich habe params in den Fällen, wo ich eine variable Anzahl von Argumenten und es trägt wesentlich zur Lesbarkeit der aufrufende code.
Beispielsweise habe ich eine Klasse, die das repräsentiert, ein TIFF-Dokument und ermöglicht den Zugriff auf eine Sammlung von Seiten, die neu angeordnet werden können, und durchsetzt mit anderen TIFF-Dokumente. Da eine der häufigsten Aufgaben, die unsere Kunden wollen, ist die Möglichkeit, einfach kombinieren Sie mehrere TIFF-Dokumente in einer einzigen, bieten wir auch die folgenden zwei Methoden:
welche in der Nutzung machen den client-code, der das Gefühl hat, wirklich nett:
Im Allgemeinen, sind Sie wahrscheinlich besser dran, die Vermeidung von nicht dokumentierten Funktionen der Sprache - und das aus mehreren Gründen.
In dem speziellen Fall, den __arglist, die Sie erreichen können, die gleichen Funktionen mit der Sprache unterstützt params Schlüsselwort, das Ihnen erlaubt zu erstellen, geben Sie-sicher variable argument-Listen für Methoden in C#. Als eine Praxis, obwohl, ich wäre vorsichtig, es zu benutzen, wie Sie es können, verbergen Sie Ihren code, wenn Sie verwendet inpropertly - gute use cases (wie in der Zeichenkette.Format (), die akzeptiert variable, Argumente) - weniger Häufig sind, als man denken würde.
Ich würde es lieber nicht verwenden alle der drei Techniken, die hier beschrieben. Ich würde stattdessen entwerfen Sie ein value-Objekt, das starke Typen, wo immer möglich, und vielleicht sogar auf null festlegbaren Typen. Wenn es hart auf hart kommt Sie können erstellen einer generisch typisierten Wert-Objekt zu.
Es ist einfach alles so viel code smell in diese Art der Codierung für mich. Ein variable Länge Sammlung von Objekt ? Würde nicht unbemerkt in meine code-review.
Bearbeiten:
Und wenn es an meinem code abgeben würde der parameter in allen Wahrscheinlichkeit ein IEnumerable-Instanz und keiner der drei Vorschläge posten. IEnumerable ist das magerste, was könnte meine Kapseln braucht.