| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Нюанс с использованием for |
| Автор: Idsa 17.4.2007, 17:24 | ||||||
Всегда считал, что в C# при вот таком объявлении:
область видимости i - внутри цикла. Вот такая структура тоже работает вполне нормально:
Но почему-то
Пасиму? |
| Автор: Void 17.4.2007, 17:32 | ||
Нельзя перекрывать локальную переменную другой с таким же именем.
Точные правила надо смотреть в спецификации… |
| Автор: Idsa 17.4.2007, 17:33 | ||
Прошу прощения: приведенный сначала нерабочий код неработает по вполне понятным причинам, а вот мне интересно, почему не работает вот это кусок:
|
| Автор: mr.DUDA 17.4.2007, 18:29 |
| Ответ, вероятно, искать нужно в спецификации C#. Лично мне самому интересно, какая причина того что переменную цикла нельзя объявлять вне оператора for. |
| Автор: Exception 17.4.2007, 22:26 |
Ничего такого http://msdn2.microsoft.com/en-us/library/aa691276(vs.71).aspx. |
| Автор: SLeN 18.4.2007, 00:34 | ||||||||
Объявить то можно, только до цикла.
Прекрасно пройдет. Но вот после объявления в for ее уже не объявить хотя и считается что ее нет в области видимости
Так компилятор ругается что она уже обвленна
а так не верит в ее существование прикольно |
| Автор: Retro 18.4.2007, 01:12 | ||
Ага.
Почему переменная цикла? Насколько я помню, еще по Си, переменная объявленная в теле цикла является локальной переменной всей функции. Перекрыть локальную переменную можно такой же(с тем же именем) но объявленной глобально. Или в C# это не должно соблюдаться? Это называется, если не изменяет память, - multiple declaration. |
| Автор: sergejzr 18.4.2007, 01:20 |
| В Вижуал С++ такая же байда и это совсем не весело. Потому что на самом деле ничего не перекрывается. Одна переменная принадлежит одному циклу, другая другому, какое может быть пересечение? gcc нормально обращается с этим, ява компилер тоже. |
| Автор: Retro 18.4.2007, 01:32 | ||
Действительно, в БорландСи такое:
компилится на ура. А в студии(на C#) нифига, пишет - The name 'i' does not exist in the current context. Что творится? Добавлено через 1 минуту и 38 секунд Рано я радовался, что C# так похож на С, нюансы, однако, прорисовываются. Будем учить. |
| Автор: Medved 18.4.2007, 01:49 |
| MS учит программистов правилам хорошего кода. |
| Автор: Retro 18.4.2007, 01:56 | ||||||
Вот, ругается -
Добавлено через 3 минуты и 12 секунд На хелп ошибки выдает:
|
| Автор: Idsa 18.4.2007, 06:59 |
Вот в Яве точно помню, что с этим проблем не было, а вот в C++ 3.1 (просто для примера Чисто теоретически возможны 2 варианта: 1. переменная, объявленная в цикле, видима только в цикле 2. переменная, объявленная в цикле, видима во всем методе. C# же смешивает 2 эти варианта |
| Автор: Wanderer2019 18.4.2007, 09:29 | ||
вот так отрабатывает корректно
|
| Автор: sergejzr 18.4.2007, 09:44 |
Это скорее MS, а не разница C / C# Не понимаю, что в этом случае хорошего Спасибо! Наглядный пример, что задумано так, а реализовано эдак |
| Автор: mr.DUDA 18.4.2007, 09:48 |
| Что-то подсказывает мне, дело тут в "parent/child scope", по-видимому for открывает child scope уже начиная с объявления переменной цикла... |
| Автор: Naum 18.4.2007, 13:03 | ||||
Ессессно. А вы как думали? И вообще я не понимаю о чем вы спорите? Почему-то то, что конструкция вида
не компилится, никого не смущает. А стоило поменять while на for то уже начинаются распри. |
| Автор: sergejzr 18.4.2007, 13:10 |
почему ты так думаешь? |
| Автор: Naum 18.4.2007, 13:24 |
| sergejzr, скорее всего это сделано для компилятора. И очень полезно для программистов. Очень легко можно запутаться, если в разных скопах будут переменные с одинаковыми именами. |
| Автор: sergejzr 18.4.2007, 14:44 |
| С другой стороны я часто пользуюсь переменной i в циклах (думаю не я один). Почему я должен выдумывать для каждого цикла новую переменную, или определять её в начале скопа? И то и другое - неудобно и не нужно. |
| Автор: Exception 18.4.2007, 15:52 | ||
Так разве
не скомплируется? |
| Автор: sergejzr 18.4.2007, 15:59 |
| В VC++ нет. Насчёт шарпа не знаю. |
| Автор: Naum 18.4.2007, 16:21 |
| Во-первых, в C# это скомпилируется. Во-вторых, чем неудобно определять переменную в начале скопа, если она у тебя используется во многих циклах? Добавлено через 2 минуты и 53 секунды И еще... Больше двух последовательных циклов в одном методе не есть гуд. ;) |
| Автор: Void 18.4.2007, 16:30 | ||
В VC++ 7.1 и новее — скомпилируется.
|
| Автор: sergejzr 18.4.2007, 16:33 | ||||
Хотя эта дискуссия для холиваров, но скажу. Такой код неудобно читать. Переменная, от которой ничего не зависит, выносится наверх вместе с "глобальными" этой функции. Просто лишнее отвлечение внимания.
Не есть гуд то кидаться в крайности и ещё не есть гуд впихивать в стандартные шаблоны нестандартные проблемы. Иногда нужно и несколько последовательных из за поставленной задачи, читаемости кода или чего нибудь ещё. |
| Автор: Medved 18.4.2007, 19:18 |
То, что пытаются скомпилить - извращение. |
| Автор: Idsa 19.4.2007, 07:53 | ||||
Хм... мало того, что вот этот код не компилится:
, так и вот это не компилится:
Я совсем запутался |
| Автор: sergejzr 19.4.2007, 09:39 |
| Idsa, это-от понятно. Переменная i определена только в цикле и не определена вне его. |
| Автор: Idsa 19.4.2007, 09:50 | ||
Это было бы так, если не учитывать предыдущий пример. Получается, что первый кусок кода говорит, что переменная i уже объявлена в данном scope. Тогда мы во втором примере, учитывая это, пытаемся заюзать эту переменную... но нам говорят, что переменной нет в данном scope. |
| Автор: Naum 19.4.2007, 10:10 | ||||
Читай внимательнее соообщения
Значит, что переменная объявлена не в этом скопе а в дочернем. Что запрещено. Нельзя объявлять переменную с одним и тем же именем в скопах находящихся на одной ветке вложенности. Нельзя и все. Так решили мс. sergejzr, теперь я скажу только за C#. Idsa, я так и не понимаю, если не будешь пользоваться переменной во внешнем скопе, нафига тебе объявлять ее во внешнем скопе. этот код запросто скомпилится в C#. Если же ты будешь использовать переменную во внешнем скопе, то объявление ее во внутреннем скопе может запросто тебя запутать.
Другой программист (да даже и ты дня через два) можешь не заметить, что в цикле ты объявляешь новую переменную (int такое маленькое слово З.Ы. (Опять же только для шарпистов). Подобный топик, ИМХО, похож на вопрос типа: "А почему программисты не используют goto?". Я свое ИМХО высказал. |