переключатель конструкция более легко переводится в переход (или ответвление) таблица . Это может сделать операторы переключения намного более эффективными, чем , если еще , когда маркировки случая близко друг к другу. Идея состоит в том, чтобы поместить набор команд перехода последовательно в памяти и затем добавить значение к счетчику команд. Это заменяет последовательность инструкций по сравнению с добавить операцией.
Ниже некоторые чрезвычайно упрощенные примеры psuedo-блока. Во-первых, если еще версия:
// C version
if (1 == value)
function1();
else if (2 == value)
function2();
else if (3 == value)
function3();
// assembly version
compare value, 1
jump if zero label1
compare value, 2
jump if zero label2
compare value, 3
jump if zero label3
label1:
call function1
label2:
call function2
label3:
call function3
Следующий версия переключателя:
// C version
switch (value) {
case 1: function1(); break;
case 2: function2(); break;
case 3: function3(); break;
}
// assembly version
add program_counter, value
call function1
call function2
call function3
Вы видите, что получающийся ассемблерный код намного более компактен. Обратите внимание, что значение должно было бы быть преобразовано в некотором роде для обработки других значений, чем 1, 2 и 3. Однако это должно проиллюстрировать понятие.
Переключатель может быть оптимизирован компиляцией r - Вы получите более быстрый код.
Также я нахожу, что он более изящен при контакте с перечислимыми типами.
Для подведения переключатель оператор дает Вам производительность + элегантность кода :)
Вот некоторые полезные ссылки:
Для выразительности переключатель/оператор выбора позволяет Вам собирать в группу несколько случаев, например:
case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
Для производительности, компиляторы могут иногда оптимизировать операторы переключения в таблицы переходов.
Я игнорирую этот тип низкоуровневой оптимизации как обычно неважный, и вероятно отличающийся от компилятора до компилятора.
я сказал бы, что основным различием является удобочитаемость. если/еще очень гибко, но когда Вы видите переключатель, Вы знаете сразу же, что все тесты против того же выражения.
Помимо другой упомянутой удобочитаемости Code и оптимизации в.NET Вы также получаете способность включить перечисления и т.д.
enum Color { Red, Green, Blue };
Color c = Color.Red;
switch (c) // Switch on the enum
{
// no casting and no need to understand what int value it is
case Color.Red: break;
case Color.Green: break;
case Color.Blue: break;
}
Способность провалиться несколько случаев (намеренно игнорирование оператора завершения) могут быть полезными, и поскольку несколько человек уже сказали, что это быстрее также. Возможно, самое важное и наименее важное соображение, хотя, то, что это просто делает для более симпатичного кода, чем если/еще.:)
Переключатель может быть оптимизирован "Лучше" некоторыми компиляторами. Существуют ловушки с использованием оператора переключения на определенных языках. В Java переключатель не может обработать строки, и в VB2005 оператор переключения не будет работать с переключателями.
Переключатель может быть быстрее и легче читать, Если тогда более универсально и будет работать в большем количестве мест.