Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .NET и C# > Зачем Break; в switch? |
Автор: Sunvas 26.6.2007, 09:43 |
Начал учить C#. Когда наткнулся на синтаксис оператора switch, меня удивило, зачем после каждого case-a разработчики придумали лепить Break;? Зачем с логической точки зрения? |
Автор: tol05 26.6.2007, 09:52 | ||
Потому что шарп не поддерживает сквозного выполнения switch. Так уж разработчики его решили, чтоб не путались программеры ![]() ![]() Поддерживает только в том случае, если case, идущие за ним, пустые
даже в последнем case, даже в default нужен break. вот насколько все было плохо ![]() |
Автор: Sunvas 26.6.2007, 10:38 |
Вот именно! Не поддерживает! Если бы поддерживал - тогда понятно, а так - не поддерживает и не понятно, почему разработчики придумали его туда лепить. Чтобы программеры не путались? Хм. А до этого они путались? Шарп от С++ и так очень отличается, так что не думаю что еще одни грабли что-то бы изменили.... |
Автор: 0000 26.6.2007, 11:03 |
ну свитч - это же как аналог if (...) {...} else {...} чтобы из всех возможных твоих вариантов выполнился один - и как только выполнился - сразу вышел, чтобы экономить время, не проверяя остальные |
Автор: Sunvas 26.6.2007, 11:15 |
0000, Брр. Ну написал же уже: !!! |
Автор: Shaggie 26.6.2007, 11:19 |
Видимо, чтобы С++ программерам проще было на шарп переходить. Хотя, согласен, решение гениальностью не отличается, меня тоже покоробило. |
Автор: Sunvas 26.6.2007, 11:34 |
Честно говоря простоты в этом не вижу. Зачем бесполезный рудимент?. |
Автор: anthony 26.6.2007, 12:31 |
Вывод: явное написание break увеличивает ясность кода (в C# этому вопросу уделено довольно большое внимание, в частности, явный синтаксис при перекрытии или сокрытии метода), а сквозное выполнение не оправдывает себя практически ни в каких случаях. |
Автор: tol05 26.6.2007, 12:32 | ||
ну, они считают, что когда ты юзаешь switch, то постоянно забываешь break и на каждом шагу у тебя получаются непредсказуемые результаты (не те, что ты ожидал, когда писал case) ![]() типа такого: хочу, чтоб если i=1, то j было 10, если i=2, то j было 20 и т.д. пишешь (в С++), ты индус, ты логику вписал, а про break - забыл!
выполняешь и: i=1 j=100; //что такое? i=2 j=100; //да, елки-палки, что такое?!! ![]() i=3 j=100; //э, шайтан проклятый, что такое?!!!!!! ![]() ![]() |
Автор: tol05 26.6.2007, 14:54 |
А я как раз за шарп и говорил как бы. Повторяю: у мелкомягких накопилось множество жалоб от программистов (не будем говорить о них плохо) о том, что они слишком часто сталкиваются с ситуацией, разрисованной мной в моем предыдущем посте. ПОЭТОМУ При разработке C#, чтобы не повторялись многочисленные critical reports по поводу выполнения switch было принято решение вынуждать разработчика ставить break всегда. |
Автор: Sunvas 26.6.2007, 15:00 | ||
Понятно... Одно слово мелкософт... Нет, чтоб хэлпы нормальные написать, они в детство ударились... Брр.. Но спасибо за разъяснения. ЗЫ. Вряд-ли я продолжу учить шарп. |
Автор: tol05 26.6.2007, 15:09 | ||
вот, специально для тебя, Sunvas, нашел ![]()
Ecma-334 стр.233 "15.7.2 The switch statement" скачать можно http://www.ecma-international.org/publications/standards/Ecma-334.htm ну, это хозяйское дело. Я вот java учить начинаю. Нафига? ![]() |
Автор: Exception 27.6.2007, 13:43 | ||
Мои пять копеек: Отказавшись от сквозного выполнения, можно было и изменить синтаксис. Лично мне эти двоеточия и break очень напоминают лейблы и goto..
Обычные фигурные скобки (или просто точка с занятой, если вариант записывается в одну строку) сделают конструкцию похожей на другие (if, do, etc), более привычной и читаемой. Также я заменил default на else, потому что моему человеческому разуму ближе именно "не 1 и не 2, значит иначе", а не "не 1 и не 2, значит по умолчанию". |
Автор: stab 28.6.2007, 01:34 | ||
что забавно действительно есть конструкция goto case X. |
Автор: tol05 28.6.2007, 09:12 | ||||
в Ecma-334 они так и называются
и т.д. вообще-то ECMA - главный учебник теперь для меня в части синтаксиса... MSDN отдыхает ![]()
Exception по-поводу твоих нововведений ![]() ![]() |
Автор: SpaceSpace 28.6.2007, 09:27 |
я так подозреваю, что при swithc(x) за ним стоят долгие if (x=y) goto y' if (x=z) goto z'... т.е. физически при swithc юзается goto!!! ну блин... не ожидал я такого, меня еще в школе долбили "goto - плохой стиль, не используй" ![]() .... надо пересматривать свои принцыпы |
Автор: Дрон 28.6.2007, 09:29 | ||||
Кстати, в самом начале же было сказано, что хотя сквозного выполнения нет, но есть вот такая конструкция:
В которой отсутствие break; в первых двух случаях вполне осмысленно. С другой стороны, присоединяюсь к тем, кого этот break; бесит. Я бы предпочёл вот такой синтаксис:
|
Автор: SpaceSpace 28.6.2007, 09:33 | ||||
ага.. в дельфе мне нравилось case 0..9 , что означало попадение в область от 0 до 9.... |
Автор: Kvazilol 28.6.2007, 10:57 |
блин а после case нельзя написать метод, надо именно константы писать!! объяните какого х! какая ему разница блин, пусть все вычисляет и сам подставляет, мне не жалко |
Автор: Exception 28.6.2007, 11:16 | ||
SpaceSpace, даже банальный if на уровне IL сводится к нескольким goto. Плохой стиль -- применять его самому, а что уж там компилятор сделает из твоего кода, это его дело. Кстати, хотя синтаксис VB .NET мне не очень нравится, оператор Select Case там мощнее:
|
Автор: Дрон 28.6.2007, 11:59 | ||
Используй if. А разница как раз в том, что компилятор оптимизирует работу switch..case перераспределяя порядок проверки условий и поэтому ему нужны константы, известные во время компиляции. |