Recentemente, passei a preferir mapear relacionamentos 1-1 usando em Dictionariesvez de Switchinstruções. Acho que é um pouco mais rápido escrever e mais fácil processar mentalmente. Infelizmente, ao mapear para uma nova instância de um objeto, não quero defini-lo assim:
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 essa construção, desperdicei ciclos de CPU e memória criando 3 objetos, fazendo o que seus construtores pudessem conter, e acabei usando apenas um deles. Também acredito que o mapeamento de outros objetos fooDict[0]nesse caso fará com que eles façam referência à mesma coisa, em vez de criar uma nova instância Fooconforme pretendido. Uma solução seria usar um 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();'
Isso está chegando a um ponto em que é muito confuso? É fácil perder isso ()no final. Ou o mapeamento para uma função / expressão é uma prática bastante comum? A alternativa seria usar um switch:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Qual invocação é mais aceitável?
- Dicionário, para pesquisas mais rápidas e menos palavras-chave (maiúsculas e minúsculas)
- Alternar: Mais comumente encontrado no código, não requer o uso de um objeto Func <> para indireção.
fooDict[0] is fooDict[0]). tanto com o lambda eo interruptor este não é o caso