In letzter Zeit habe ich es vorgezogen, 1-1-Beziehungen Dictionaries
anstelle von Switch
Anweisungen abzubilden . Ich finde es etwas schneller zu schreiben und mental einfacher zu verarbeiten. Leider möchte ich beim Zuordnen zu einer neuen Instanz eines Objekts dieses nicht so definieren:
var fooDict = new Dictionary<int, IBigObject>()
{
{ 0, new Foo() }, // Creates an instance of Foo
{ 1, new Bar() }, // Creates an instance of Bar
{ 2, new Baz() } // Creates an instance of Baz
}
var quux = fooDict[0]; // quux references Foo
Angesichts dieses Konstrukts habe ich CPU-Zyklen und Speicher verschwendet, indem ich 3 Objekte erstellt habe, wobei ich alles getan habe, was ihre Konstruktoren enthalten könnten, und nur eines davon verwendet habe. Ich glaube auch, dass das Zuordnen anderer Objekte fooDict[0]
in diesem Fall dazu führt, dass sie auf dasselbe verweisen, anstatt eine neue Instanz von Foo
wie beabsichtigt zu erstellen . Eine Lösung wäre, stattdessen ein Lambda zu verwenden:
var fooDict = new Dictionary<int, Func<IBigObject>>()
{
{ 0, () => new Foo() }, // Returns a new instance of Foo when invoked
{ 1, () => new Bar() }, // Ditto Bar
{ 2, () => new Baz() } // Ditto Baz
}
var quux = fooDict[0](); // equivalent to saying 'var quux = new Foo();'
Kommt das an einen Punkt, an dem es zu verwirrend ist? Es ist leicht, das ()
am Ende zu übersehen . Oder ist das Abbilden auf eine Funktion / einen Ausdruck eine ziemlich übliche Praxis? Die Alternative wäre, einen Schalter zu verwenden:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Welcher Aufruf ist akzeptabler?
- Wörterbuch für schnellere Suche und weniger Stichwörter (case and break)
- Schalter: Wird häufiger im Code verwendet und erfordert nicht die Verwendung eines Func <> -Objekts zur Indirektion.
fooDict[0] is fooDict[0]
) dieselbe Instanz zurückgegeben . sowohl beim lambda als auch beim switch ist dies nicht der fall