Подтвердить что ты не робот

Словарь с делегатом или переключателем?

Я пишу парсер, который вызывает некоторые функции, зависящие от некоторого значения.

Я могу реализовать эту логику с помощью простого переключателя следующим образом:

switch(some_val)   
{   
    case 0:   
        func0();   
        break;   
    case 1:   
        func1();   
        break;   
}     

или с делегатами и словарем вроде этого:

delegate void some_delegate();   
Dictionary<int, some_delegate> some_dictionary = new Dictionary<int, some_delegate>();   
some_dictionary[0] = func0;   
some_dictionary[1] = func1;   

some_dictionary[some_value].Invoke();    

Являются ли эти два метода эквивалентными и которые предпочтительны?

4b9b3361

Ответ 1

В терминах доступа они идентичны: оба просто проверяют, имеет ли это конкретное значение соответствующий результат. Однако, если вы попытаетесь получить доступ к несуществующему ключу, словарь будет вызывать исключение из-за границы.

Выбор должен в первую очередь состоять в повторном использовании. Если вам нужно только сделать эту ветвящуюся логику в одной точке, то использование ключа-переключателя, вероятно, имеет больше смысла, чем сохранение переменной. Если вам нужно получить доступ к нему несколько раз в отдельных точках, используйте словарь, чтобы сохранить себя от повторного повторного включения инструкции switch.

Ответ 2

Я сильно предпочитаю выбор словаря, потому что с инициализатором он может быть намного более компактным и читаемым:

var actions = new Dictionary<int, Action>
{
  {1, () => Console.WriteLine("One!")},
  {2, () => Console.WriteLine("Two!")}
}

Кроме того, у вас есть еще больше гибкости; вы можете добавлять условия и действия программно, что часто бывает удобно, в зависимости от того, что вы делаете.

Ответ 3

Если типичный программист в вашей команде похож на те, с которыми я часто сталкиваюсь, вы должны пойти на самый простой вариант, то есть на коммутатор. Делегаты мне кажутся "умным" решением, которое не требуется.

Ответ 4

Мне нравится словарь, потому что он дает вам возможность поменять ваши лямбда-выражения по мере необходимости. Это отличный трюк для программиста, который держит в сумке инструментов для случаев, связанных с программами, использующими сложные деревья решений. Было бы очень громоздко модифицировать блоки блокировки коммутатора во время выполнения, и лучший ответ в конечном итоге закончится включением lambdas.

У меня когда-то была ситуация, когда мне нужно было создать инструкцию switch динамически. Этот метод обеспечил гораздо более читаемое решение.

Ответ 5

Оба делают то же самое (хорошо, вы должны проверить, появляется ли ключ в диалоговом окне).

Это просто вопрос читаемости. Что выглядит лучше всего для вас и более важно, что предпочитают люди, читающие ваш код.

(я думаю, словарь)

Ответ 6

Если вам нужно включить строки в файле ресурсов, скажем, для целей глобализации, вам нужно будет использовать подход словаря/делегата.