В целом (с учетом всех языков и всех компиляторов) оператор switch МОЖЕТ СОДЕРЖАТЬ, когда оператор if / else, потому что компилятору легко генерировать таблицы переходов из операторов switch. То же самое можно сделать для операторов if / else с учетом соответствующих ограничений, но это гораздо сложнее.
В случае C # это также верно, но по другим причинам.
С большим количеством строк, есть существенное преимущество в производительности при использовании оператора switch, потому что компилятор будет использовать хеш-таблицу для реализации перехода.
При небольшом количестве строк производительность между ними одинакова.
Это потому, что в этом случае компилятор C # не генерирует таблицу переходов. Вместо этого он генерирует MSIL, который эквивалентен блокам IF / ELSE.
Существует инструкция MSIL «оператор переключения», которая при соединении будет использовать таблицу переходов для реализации оператора переключения. Однако он работает только с целочисленными типами (этот вопрос касается строк).
Для небольшого числа строк компилятору эффективнее генерировать блоки IF / ELSE, чем использовать хеш-таблицу.
Когда я первоначально заметил это, я сделал предположение, что поскольку блоки IF / ELSE использовались с небольшим количеством строк, компилятор сделал то же преобразование для большого числа строк.
Это было НЕПРАВИЛЬНО. «IMA» был достаточно любезен, чтобы указать мне на это (ну ... он не был добр к этому, но он был прав, а я был неправ, что является важной частью)
Я также сделал предположение о том, что в MSIL отсутствует инструкция «switch» (я подумал, что если есть примитив switch, почему они не используют его с хеш-таблицей, поэтому не должно быть переключи примитив ....). Это было неправильно и невероятно глупо с моей стороны. И снова «ИМА» указал мне на это.
Я сделал здесь обновления, потому что это пост с самым высоким рейтингом и принятый ответ.
Тем не менее, я сделал это вики-сообществом, потому что полагаю, что не заслуживаю REP за то, что ошибался Если у вас есть шанс, пожалуйста, проголосуйте за пост Има.