Останнім часом я віддаю перевагу відображення взаємозв'язків 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;
}
Яке виклик є більш прийнятним?
- Словник для швидшого пошуку та зменшення кількості ключових слів (регістр та перерва)
- Перемикач: Частіше зустрічається в коді, не вимагає використання об'єкта Func <> для непрямості.
fooDict[0] is fooDict[0]
). і з лямбда, і з вимикачем це не так