Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Особенности конструкции switch в C# 
V
    Опции темы
Idsa
Дата 7.10.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



Вот цитата из 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"? Сколько помню, это вызывало только проблемы...


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
zaver
Дата 7.10.2007, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 15.8.2005

Репутация: 1
Всего: 3



ну иногда ты можещь break не писать. например тебе надо сделать такую конструкцию: case 0: if (predicate) break else throw new Exception("");
PM MAIL WWW ICQ Skype YIM MSN   Вверх
Kuvaldis
Дата 7.10.2007, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 1
Всего: 61



Idsa, 
Цитата

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

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

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

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


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Alek86
Дата 8.10.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 1
Всего: 25



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


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

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
mihryak
Дата 8.10.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



обсуждалось много раз, вроде даже здесь
1. break оставили, чтобы легче переход с плюсов проходил
2. обязали писать, чтобы исключить потенциальные ошибки, шарп совершенно справедливо позиционируется как весьма строгий, надёжный и однозначный язык
PM MAIL ICQ   Вверх
snav
Дата 8.10.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 8.9.2007

Репутация: нет
Всего: 4



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

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

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



Это сообщение отредактировал(а) snav - 8.10.2007, 18:07
PM   Вверх
tol05
Дата 8.10.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Цитата(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... ИМХО все это черезмерно запарит код проверять.

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

Это сообщение отредактировал(а) tol05 - 8.10.2007, 21:20


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Idsa
Дата 8.10.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 6
Всего: 62



Всем спасибо за обсуждение.

Kuvaldis, +1 по репе smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.