Recientemente, he llegado a preferir mapear relaciones 1-1 usando en Dictionarieslugar de Switchdeclaraciones. Creo que es un poco más rápido de escribir y más fácil de procesar mentalmente. Desafortunadamente, cuando se asigna a una nueva instancia de un objeto, no quiero definirlo así:
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
Dada esa construcción, desperdicié ciclos de CPU y memoria creando 3 objetos, haciendo lo que sus constructores pudieran contener, y solo terminé usando uno de ellos. También creo que mapear otros objetos fooDict[0]en este caso hará que hagan referencia a lo mismo, en lugar de crear una nueva instancia de Foolo previsto. Una solución sería usar una lambda en su lugar:
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();'
¿Esto está llegando a un punto donde es demasiado confuso? Es fácil perderse eso ()al final. ¿O es el mapeo a una función / expresión una práctica bastante común? La alternativa sería usar un interruptor:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
¿Qué invocación es más aceptable?
- Diccionario, para búsquedas más rápidas y menos palabras clave (mayúsculas y minúsculas)
- Switch: más comúnmente encontrado en el código, no requiere el uso de un objeto Func <> para la indirección.
fooDict[0] is fooDict[0]). tanto con el lambda y el interruptor este no es el caso