Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Особенности конструкции switch в C#


Автор: Idsa 7.10.2007, 23:08
Вот цитата из MSDN по поводу switch:
Цитата

Control is transferred to the case statement which matches the value of the switch. The switch statement can include any number of case instances, but no two case statements can have the same value. Execution of the statement body begins at the selected statement and proceeds until the break statement transfers control out of the case body. A jump statement such as a break is required after each case block, including the last block whether it is a case statement or a default statement. With one exception, (unlike the C++ switch statement), C# does not support an implicit fall through from one case label to another. The one exception is if a case statement has no code.

Мне не очень понятно, зачем понадобилось требовать от разработчиков писать break в каждом case, раз "сквозной" проход по case'ам запрещен и отлавливается на этапе компиляции. Или, может, это сделано для большей прозрачности кода?

P. S. Есть ли разумное объяснение тому, что в C++ разрешено "implicit fall through from one case label to another"? Сколько помню, это вызывало только проблемы...

Автор: zaver 7.10.2007, 23:20
ну иногда ты можещь break не писать. например тебе надо сделать такую конструкцию: case 0: if (predicate) break else throw new Exception("");

Автор: Kuvaldis 7.10.2007, 23:20
Idsa, 
Цитата

Мне не очень понятно, зачем понадобилось требовать от разработчиков писать break в каждом case, раз "сквозной" проход по case'ам запрещен и отлавливается на этапе компиляции. Или, может, это сделано для большей прозрачности кода?

В шарпе, чтобы "проваливаться" сквозь метки нужно ЯВНО указать это при помощи ключевого слова goto в нужную метку
Таким образом гарантируется осознанность такого шага
Конечно, кода больше чем в С++, но от потенциальных ошибок спасает
Помнится, я как-то после default в С++ break не поставил, а потом дописал еще один обработчик после default... и не очень понял поначалу, отчего проблемы :(
Цитата

Есть ли разумное объяснение тому, что в C++ разрешено "implicit fall through from one case label to another"?

В С++ (и в шарпе)  в отличие от паскаля с дельфи нельзя указывать перечислимые типы в качестве меток, т.е.
case 1..20 не пройдет: нужно указывать все явно
вот для этого ИМХО это и было сделано 

Автор: Alek86 8.10.2007, 09:12
Цитата(Kuvaldis @  7.10.2007,  23:20 Найти цитируемый пост)
В шарпе, чтобы "проваливаться" сквозь метки нужно ЯВНО указать это при помощи ключевого слова goto в нужную метку


вопрос, как понимаю в том состоит, ЗАЧЕМ при всем этом писать еще и break?
Если для С++ все ясно, то почему это осталось в шарпе?

Я ответа не знаю, потому присоединяюсь к вопросу

Автор: mihryak 8.10.2007, 13:08
обсуждалось много раз, вроде даже здесь
1. break оставили, чтобы легче переход с плюсов проходил
2. обязали писать, чтобы исключить потенциальные ошибки, шарп совершенно справедливо позиционируется как весьма строгий, надёжный и однозначный язык

Автор: snav 8.10.2007, 18:05
Цитата(mihryak @ 8.10.2007,  13:08)
обсуждалось много раз, вроде даже здесь
1. break оставили, чтобы легче переход с плюсов проходил
2. обязали писать, чтобы исключить потенциальные ошибки, шарп совершенно справедливо позиционируется как весьма строгий, надёжный и однозначный язык

Не похоже, чтобы легкость перехода с плюсов особо заботила разработчиков шарпа. Иначе они сохранили бы в шарпе многие удобства и полезности синтаксиса C++.

Что касается вопроса, почему сделано именно так?... На мой взгляд, шарп - это вообще один сплошной вопрос "ПОЧЕМУ?". Я еще не встречал человека, которому бы удалось понять логику его создателей. Судя по всему, её там просто нет. Это нужно принять как факт и смириться. Альтернативы шарпу всё-равно нет. Может когда-нибудь появится C++ для .NET (не C++/CLI, а нормальный C++, адаптированный под .NET), тогда можно будет выбирать.


Автор: tol05 8.10.2007, 21:18
Цитата(snav @  8.10.2007,  18:05 Найти цитируемый пост)
Не похоже, чтобы легкость перехода с плюсов особо заботила разработчиков шарпа. Иначе они сохранили бы в шарпе многие удобства и полезности синтаксиса C++.
не только с плюсов, но и с VB (foreach, если не ошибаюсь, оттуда) и других языков. Особенно ждут массового ренегатства java-девелоперов  smile (с java больше всего содрали.)

Цитата(snav @  8.10.2007,  18:05 Найти цитируемый пост)
Что касается вопроса, почему сделано именно так?... На мой взгляд, шарп - это вообще один сплошной вопрос "ПОЧЕМУ?". Я еще не встречал человека, которому бы удалось понять логику его создателей. Судя по всему, её там просто нет. 

Очень самонадеянное заяление. Логика есть и я во многом с ней согласен (хотя скучаю по кое-чему с плюсов smile ). Не буду распространяться на эту тему дальше (ибо "религиозные войны" - это отдельный подфорум и желающим - туда).

Конкретно по поводу брейков - мне нравится в шарпе его более строгий тон. Пара лишних строк кода глаза, руки и голову не испортят, но сквозное выполнение ... особенно если switch имеет более 10 меток, да не просто маршрутиризует в функцию, а содержит в каждой метке блоки кода...
Это непросто не только новому девелоперу объяснить, но и самому потестить smile

Да к тому не будем забывать, что сам синтаксис языка усложняется. Если добавлять в switch анонимные методы, с их непросто читаемым синтаксисом и проникающим доступом к переменным... Лямда-функции с 3.0... ИМХО все это черезмерно запарит код проверять.

Лично мое мнение.

Автор: Idsa 8.10.2007, 23:21
Всем спасибо за обсуждение.

Kuvaldis, +1 по репе smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)