Тестирование с помощью Visual Studio 11 Developer Preview показывает, что если в вашем операторе switch меньше 7 случаев (6 случаев и значение по умолчанию), то компилятор генерирует серию операторов if
.Ваш пример кода преобразуется в эквивалент:
string s = abc.ToLower();
if (s == "123") return "Numeric";
if (s == "ab") return "Alphabetic";
return "symbol";
Если есть 7 или более случаев, компилятор генерирует код, который создает словарь, сопоставляя строки с последовательными целыми числами.Затем он использует оператор IL switch
(который аналогичен вычисленному goto на других языках) для перехода к другому коду на основе значений.
Код генерируется таким образом, что словарь создается только один раз.- первый раз выполняется оператор switch.Последующее использование этого оператора switch не требует повторного создания словаря.
С точки зрения эффективности код компилятора, сгенерированный для небольшого оператора switch, эквивалентен множественным операторам if.Когда имеется более 6 случаев (включая значение по умолчанию), поиск в словаре компилятора будет выполняться быстрее, чем несколько операторов switch.
Обратите внимание, что мои числа основаны на очень маленькой выборке (несколько тестов) с использованиемпредварительный просмотр невыпущенной версии компилятора.Предыдущие версии компилятора могли иметь другое пороговое значение или могли использовать другие методы, и окончательная версия нового компилятора могла бы действовать иначе, чем я описал выше.Я бы не стал рассчитывать ни на одну из этих деталей реализации.
Короче, напишите switch
.Пусть компилятор беспокоится о том, как сделать это быстрее.