Интересный вопрос. Это возникло несколько недель назад на работе, и мы нашли ответ, написав пример фрагмента и просмотрев его в .NET Reflector (рефлектор потрясающий !! Мне очень нравится).
Вот что мы обнаружили:
Действительный оператор switch для чего-либо, кроме строки, компилируется в IL как оператор switch. Однако, если это строка, она переписывается как if / else if / else в IL. Поэтому в нашем случае мы хотели узнать, как операторы switch сравнивают строки, например, учитывает регистр и т. Д., И рефлектор быстро дал нам ответ. Это было полезно знать.
Если вы хотите выполнять сравнение строк с учетом регистра, то вы могли бы использовать оператор switch, поскольку он быстрее, чем выполнение String.Compare в if / else. (Редактировать: Читать Что быстрее, включить строку или другое в типе? для некоторых реальных тестов производительности) Однако, если вы хотите сделать регистр нечувствительным, тогда лучше использовать if / else в качестве результата код не красивый
switch (myString.ToLower())
{
// not a good solution
}
Лучшее практическое правило - использовать операторы switch, если это имеет смысл (серьезно), например:
- улучшает читабельность вашего кода
- вы сравниваете диапазон значений (float, int) или enum
Если вам нужно манипулировать значением для подачи в оператор switch (создать временную переменную для переключения), то вам, вероятно, следует использовать оператор управления if / else.
Обновление:
На самом деле лучше преобразовать строку в верхний регистр (например, ToUpper()
), поскольку очевидно, что есть дополнительные оптимизации, которые компилятор "точно в срок" может делать по сравнению с ToLower()
. Это микрооптимизация, однако в узком кругу это может быть полезно.
Небольшое примечание:
Чтобы улучшить читаемость операторов switch, попробуйте следующее:
- поставить наиболее вероятную ветвь первой, т.е. наиболее доступную
- если они все могут произойти, перечислите их в алфавитном порядке, чтобы их было легче найти.
- никогда не использовать стандартную перехват для последнего оставшегося условия, это лениво и вызовет проблемы позже в жизни кода.
- использовать стандартную перехват для утверждения неизвестного условия, даже если это вряд ли когда-либо произойдет. вот для чего хороши утверждения.