В последнее время я предпочел отображать отношения 1-1, используя Dictionaries
вместо Switch
операторов. Я считаю, что это немного быстрее писать и легче мысленно обрабатывать. К сожалению, при сопоставлении с новым экземпляром объекта я не хочу определять его следующим образом:
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
Учитывая эту конструкцию, я потратил впустую циклы ЦП и память, создавая 3 объекта, делая то, что могли содержать их конструкторы, и в итоге использовал только один из них. Я также считаю, что сопоставление других объектов fooDict[0]
в этом случае приведет к тому, что они будут ссылаться на одну и ту же вещь, а не на создание нового экземпляра, Foo
как предполагалось. Решение было бы использовать вместо этого лямбда:
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();'
Это доходит до того, что это слишком запутанно? Это легко пропустить ()
в конце. Или отображение на функцию / выражение является довольно распространенной практикой? Альтернативой было бы использовать переключатель:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Какой вызов более приемлем?
- Словарь, для быстрого поиска и меньше ключевых слов (case and break)
- Переключатель: чаще встречается в коде, не требует использования объекта Func <> для косвенного обращения.
fooDict[0] is fooDict[0]
). как с лямбдой, так и с переключателем это не так