Di recente, sono venuto a preferire la mappatura delle relazioni 1-1 utilizzando Dictionaries
anziché le Switch
istruzioni. Trovo che sia un po 'più veloce da scrivere e più facile da elaborare mentalmente. Sfortunatamente, quando si mappa su una nuova istanza di un oggetto, non voglio definirlo in questo modo:
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
Dato quel costrutto, ho sprecato i cicli della CPU e la memoria creando 3 oggetti, facendo tutto ciò che i loro costruttori potrebbero contenere e alla fine ne ho usato solo uno. Credo anche che la mappatura di altri oggetti fooDict[0]
in questo caso li indurrà a fare riferimento alla stessa cosa, piuttosto che creare una nuova istanza Foo
come previsto. Una soluzione sarebbe invece usare un lambda:
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();'
Sta arrivando a un punto in cui è troppo confuso? È facile perderlo ()
alla fine. O la mappatura su una funzione / espressione è una pratica abbastanza comune? L'alternativa sarebbe usare un interruttore:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Quale invocazione è più accettabile?
- Dizionario, per ricerche più rapide e meno parole chiave (maiuscole e minuscole)
- Switch: più comunemente presente nel codice, non richiede l'uso di un oggetto Func <> per l'indirizzamento indiretto.
fooDict[0] is fooDict[0]
). sia con la lambda che con l'interruttore questo non è il caso