![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Начал учить C#. Когда наткнулся на синтаксис оператора switch, меня удивило, зачем после каждого case-a разработчики придумали лепить Break;? Зачем с логической точки зрения?
-------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Потому что шарп не поддерживает сквозного выполнения switch. Так уж разработчики его решили, чтоб не путались программеры
Поддерживает только в том случае, если case, идущие за ним, пустые
даже в последнем case, даже в default нужен break. вот насколько все было плохо Это сообщение отредактировал(а) tol05 - 26.6.2007, 09:54 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Вот именно! Не поддерживает! Если бы поддерживал - тогда понятно, а так - не поддерживает и не понятно, почему разработчики придумали его туда лепить. Чтобы программеры не путались? Хм. А до этого они путались? Шарп от С++ и так очень отличается, так что не думаю что еще одни грабли что-то бы изменили.... -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| 0000 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.7.2006 Где: Нижний Новгород Репутация: 2 Всего: 5 |
ну свитч - это же как аналог if (...) {...} else {...}
чтобы из всех возможных твоих вариантов выполнился один - и как только выполнился - сразу вышел, чтобы экономить время, не проверяя остальные |
|||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
0000, Брр. Ну написал же уже:
!!! -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| Shaggie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Видимо, чтобы С++ программерам проще было на шарп переходить.
Хотя, согласен, решение гениальностью не отличается, меня тоже покоробило. |
|||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Честно говоря простоты в этом не вижу. Зачем бесполезный рудимент?. -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| anthony |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 25.6.2007 Где: Украина Репутация: 1 Всего: 5 |
Вывод: явное написание break увеличивает ясность кода (в C# этому вопросу уделено довольно большое внимание, в частности, явный синтаксис при перекрытии или сокрытии метода), а сквозное выполнение не оправдывает себя практически ни в каких случаях. |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
ну, они считают, что когда ты юзаешь switch, то постоянно забываешь break и на каждом шагу у тебя получаются непредсказуемые результаты (не те, что ты ожидал, когда писал case)
типа такого: хочу, чтоб если i=1, то j было 10, если i=2, то j было 20 и т.д. пишешь (в С++), ты индус, ты логику вписал, а про break - забыл!
выполняешь и: i=1 j=100; //что такое? i=2 j=100; //да, елки-палки, что такое?!! i=3 j=100; //э, шайтан проклятый, что такое?!!!!!! -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Sunvas |
|
||||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
anthony, я же и говорю, что нет сквозного выполнения, так зачем бряку оставлять!
Чем? Почему?
И снова привыкли... Не в превычке тут дело (!) т.к. отличия С++ и С# уж очень велики из без этой бряки. Я вот не привык, и использование бряки в конце кейса мне кажется бредом (снова таки ссылаясь на то, что нет в шарпе сквозного выполнения). И почему сложно отказаться? Это дело принципа или маразма? А по-моиму наоборот: хз для чего эта бряка там нужна. tol05, мы за шарп говорим, а не за ++. -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
||||
|
|||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
А я как раз за шарп и говорил как бы. Повторяю: у мелкомягких накопилось множество жалоб от программистов (не будем говорить о них плохо) о том, что они слишком часто сталкиваются с ситуацией, разрисованной мной в моем предыдущем посте. ПОЭТОМУ При разработке C#, чтобы не повторялись многочисленные critical reports по поводу выполнения switch было принято решение вынуждать разработчика ставить break всегда. -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Понятно... Одно слово мелкософт... Нет, чтоб хэлпы нормальные написать, они в детство ударились... Брр.. Но спасибо за разъяснения. ЗЫ. Вряд-ли я продолжу учить шарп. -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
вот, специально для тебя, Sunvas, нашел
Ecma-334 стр.233 "15.7.2 The switch statement" скачать можно отсюда ну, это хозяйское дело. Я вот java учить начинаю. Нафига? -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Exception |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 29 Всего: 186 |
Мои пять копеек:
Отказавшись от сквозного выполнения, можно было и изменить синтаксис. Лично мне эти двоеточия и break очень напоминают лейблы и goto..
Обычные фигурные скобки (или просто точка с занятой, если вариант записывается в одну строку) сделают конструкцию похожей на другие (if, do, etc), более привычной и читаемой. Также я заменил default на else, потому что моему человеческому разуму ближе именно "не 1 и не 2, значит иначе", а не "не 1 и не 2, значит по умолчанию". |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 22 Всего: 48 |
что забавно действительно есть конструкция goto case X. -------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
в Ecma-334 они так и называются
и т.д. вообще-то ECMA - главный учебник теперь для меня в части синтаксиса... MSDN отдыхает
Exception по-поводу твоих нововведений -------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| SpaceSpace |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 10.4.2007 Где: Самара Репутация: 2 Всего: 10 |
я так подозреваю, что при swithc(x)
за ним стоят долгие if (x=y) goto y' if (x=z) goto z'... т.е. физически при swithc юзается goto!!! ну блин... не ожидал я такого, меня еще в школе долбили "goto - плохой стиль, не используй" .... надо пересматривать свои принцыпы -------------------- Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение. 70-565 MCPD Enterprise 3.5 |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Кстати, в самом начале же было сказано, что хотя сквозного выполнения нет, но есть вот такая конструкция:
В которой отсутствие break; в первых двух случаях вполне осмысленно. С другой стороны, присоединяюсь к тем, кого этот break; бесит. Я бы предпочёл вот такой синтаксис:
-------------------- Да. Именно так. |
||||
|
|||||
| SpaceSpace |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 10.4.2007 Где: Самара Репутация: 2 Всего: 10 |
ага.. в дельфе мне нравилось case 0..9 , что означало попадение в область от 0 до 9.... Это сообщение отредактировал(а) SpaceSpace - 28.6.2007, 09:37 -------------------- Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение. 70-565 MCPD Enterprise 3.5 |
||||
|
|||||
| Kvazilol |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 7.12.2006 Репутация: нет Всего: нет |
блин а после case нельзя написать метод, надо именно константы писать!! объяните какого х! какая ему разница блин, пусть все вычисляет и сам подставляет, мне не жалко
|
|||
|
||||
| Exception |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 4525 Регистрация: 26.12.2004 Репутация: 29 Всего: 186 |
SpaceSpace, даже банальный if на уровне IL сводится к нескольким goto. Плохой стиль -- применять его самому, а что уж там компилятор сделает из твоего кода, это его дело.
Кстати, хотя синтаксис VB .NET мне не очень нравится, оператор Select Case там мощнее:
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Используй if. А разница как раз в том, что компилятор оптимизирует работу switch..case перераспределяя порядок проверки условий и поэтому ему нужны константы, известные во время компиляции. -------------------- Да. Именно так. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |