Das folgende Beispiel ist schlecht, da es Codewiederholung hat. Zum Beispiel, wenn wir später CheckExpirationDate
vor dem Trinken brauchen, müssen wir den Funktionsaufruf an mehreren Stellen hinzufügen. Wenn wir charley
und zu der Party hinzufügen müssen, wird der Code sehr schnell.Behandeln einer Reihe von benannten Variablen des gleichen Typs
if (john != designatedDriver)
{
beer.Open();
john.Drink(beer);
}
if (bob != designatedDriver)
{
cider.Open();
bob.Drink(cider);
}
Die Lösung könnte sein, ein Array dieser Objekte zu erstellen. Das ist sehr einfach, wenn Sie ein Objekt gleichzeitig bedienen müssen. Zum Beispiel ist vorbei, wenn jeder um eine einzige Flasche Bier:
beer.Open();
foreach (Dude i in new Dude[] { john, bob })
{
i.Drink(beer);
}
das ursprüngliche Beispiel zu umschreiben, wir KeyValuePair
verwenden können. Nicht besonders schön, aber es lohnt sich für mehr als zwei Jungs oder wenn der Trinkvorgang lang genug ist (Weinprobe).
foreach (KeyValuePair<Dude, Booze> i in KeyValuePair<Dude, Booze>[] {
new KeyValuePair<Dude, Booze>(john, beer),
new KeyValuePair<Dude, Booze>(bob, cider) })
{
if (i.Key != designatedDriver)
{
i.Value.Open();
i.Key.Drink(i.Value);
}
}
Aber was, wenn wir zu einer Zeit, drei oder mehr Objekte in Betrieb nehmen müssen? Zum Beispiel John Getränke Bier und isst Nachos. Wir können darauf zurückgreifen, benutzerdefinierte Typen zu deklarieren, aber das würde den Code von irgendwo weit entferntem Code abhängig machen. Wir könnten jeden Typ in ein eigenes Array setzen und eine gute alte for
-Schleife ausführen und auf die Objekte mit Indizes zugreifen, aber das würde bedeuten, benannte Arrays zu erzeugen (Dude[] dudes = new Dude { john, bob };
).
Was ich frage ist, gibt es einige ausgefallene C# Trick, die mich das sehr sauber und kompakt machen würde? Anonyme Typen? Etwas?
Ihr erstes und drittes Codebeispiel sind nicht gleichwertig, wie Sie sagen. In der dritten Probe trinkt Bob nie seinen Apfelwein ... – LBushkin
Aufwendig, bitte. – CannibalSmith