С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
49 / 49 / 5
Регистрация: 11.07.2011
Сообщений: 282
1

Область видимости. Объясните ошибку.

16.08.2011, 18:34. Показов 4019. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При компиляции вот такого кода :
C#
1
2
3
4
5
6
static void Main(string[] args)
        {
            for (int i = 0; i < 5; i++) ;
            int i = 5;
 
        }
возникает ошибка:Ошибка 1 Невозможно объявить локальную переменную с именем "i" в этой области видимости, т.к. она придаст другое значение "i", которое уже используется в области видимости "дочерний" для обозначения другого понятия.
Мне непонятно, если переменная уже инициализирована, так почему её нельзя использовать например вот так:
C#
1
2
for (int i = 0; i < 5; i++) ;
            i = 5;
Получается, объявленные переменные в цикле for мы не можем использовать и объявлять за пределами цикла for?

C#
1
2
3
4
5
6
for (int i = 0; i < 5; i++)
            {
                int temp = 0;
            }
 
            int temp = 5;
Непонятно почему программа не дает скомпилиться, почему разработчики запретили это ,если кусок кода for выполнится раньше инициализации
C#
1
int temp = 5
и не возникнет никаких проблем/потери данных. В с++ если не ошибаюсь таких проблем бы не возникло.
1
IT_Exp
Эксперт
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
Блог
16.08.2011, 18:34
Ответы с готовыми решениями:

Область видимости
Form.cs using System; using System.Collections.Generic; using System.ComponentModel; using...

Область видимости
Дня два назад меня дёрнуло наконец понять что из себя представляет до - диез. Начал я с банальной...

Область видимости и прочее
1. Когда я читал книги, там было написано, что если переменной не присвоена область видимости, то...

Область видимости объекта
Собственно вопрос в следующем: как сделать объект dom созданный одним методом доступным в другом...

3
15 / 12 / 4
Регистрация: 03.02.2011
Сообщений: 96
16.08.2011, 18:55 2
C#
1
2
for (int i = 0; i < 5; i++) ;
            i = 5;
так использовать переменную "i" нельзя, потому что она объявлена в цикле, а по завершению цикла она умечтожается.

если было бы так:
C#
1
2
for (int i = 0; i < 5; i++)
            i = 5;
то переменную можно использовать, потому что она в цикле.

C#
1
2
3
4
5
6
for (int i = 0; i < 5; i++)
            {
                int temp = 0;
            }
 
            int temp = 5;
объявляя так, у тебя переменная "temp" умичтожиться по завершению цикла и создадится новая. Но у тут глупо написано, потому что с каждым проходом цикла будет создаваться переменная temp, тем самым ты просто будешь забивать память.

Добавлено через 7 минут
в С++ нет такого, действительно! видно в C# сделали так, чтобы не повторялись переменные, но это к лучшему, ведь не будет теряться данные. Но это одна сторона вопроса. Хотя одинаковые имена переменных могут быть в разных функциях вроде. Но это вопросы уже в разработчикам!
0
49 / 49 / 5
Регистрация: 11.07.2011
Сообщений: 282
16.08.2011, 19:34  [ТС] 3
Хорошо, если переменная по выходу из цикла уничтожается, то что мешает создать такую же по выходу из цикла?
C#
1
2
for (int i = 0; i < 5; i++)
          int  i = 5;
Если было бы написано вот так:
C#
1
2
int i = 5;
for (int i = 0; i < 5; i++)
то тут понятно, в одной области видимости не может быть дважды объявлена одна переменная.
Видимо, просто разработчики сделали общее правило " в одной области видимости(также включая подобласти) не может быть переменных с одним именем. В независимости от того, до цикла, или после если взять наш случай.
Таким образом если пишем вот так:
C#
1
for (int i = 0; i < 5; i++){}
теряем возможность использовать дальше в коде переменную i (если не выделять в отдельный блок {})
если пишем вот так:
C#
1
2
int i;
for (i = 0; i < 5; i++){}
То такая возможность появляется.
Все правильно?)

Добавлено через 5 минут
Хорошо, если переменная по выходу из цикла уничтожается, то что мешает создать такую же по выходу из цикла?
C#
1
2
for (int i = 0; i < 5; i++)
          int  i = 5;
Если было бы написано вот так:
C#
1
2
int i = 5;
for (int i = 0; i < 5; i++)
то тут понятно, в одной области видимости не может быть дважды объявлена одна переменная.
Видимо, просто разработчики сделали общее правило " в одной области видимости(также включая подобласти) не может быть переменных с одним именем. В независимости от того, до цикла, или после если взять наш случай.
Таким образом если пишем вот так:
C#
1
for (int i = 0; i < 5; i++){}
теряем возможность использовать дальше в коде переменную i (если не выделять в отдельный блок {})
если пишем вот так:
C#
1
2
int i;
for (i = 0; i < 5; i++){}
То такая возможность появляется.
Все правильно?)
0
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,278
17.08.2011, 16:36 4
Dimblch,

Цитата из книги Шилдт-а (C# 4.0 полное руководство)

"ни у одной из переменных из внутренней области действия не должно быть такое же имя, как у переменной из внешней области действия"

Эта возможность в C# разработчиками сознательно заблокирована. Они посчитали, что в классе или методе одинаковые имена переменных (даже, если они уничтожаются при выходе из области видимости) вносят сумятицу, и как следствие - вероятность совершить ошибку в логике кода.


Если тебе нужно использовать переменную в разных облястях видимости, сделай ее глобальной
C#
1
static int i;
1
17.08.2011, 16:36
BasicMan
Эксперт
19315 / 2622 / 84
Регистрация: 17.02.2009
Сообщений: 10,364
Блог
17.08.2011, 16:36
Помогаю со студенческими работами здесь

Область видимости в try.. catch ..
Добрый день. Я новичок в с#. Пытаюсь решить такую задачу. 1. Объявляю переменные. 2....

Область видимости объекта
Нужна теория об области видимости объекта

Область видимости переменной
создаю форму есть класс namespace WF_2 { class TS { public string name;...

Область видимости DataSet
Здравствуйте! В основном теле приложения я создаю DataSet и DataTable DataSet dsAgreg = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Блоги программистов
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(шес­­­­­­­­­­­­­­­ти­б­и­т­н­ы­й асихронный счётчик с управляющим сигналом заде
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
Angular vs React vs Vue.js
BasicMan 03.01.2025
О, друзья-разработчики и просто любопытные читатели! Сегодня мы отправимся в увлекательное путешествие по миру фронтенд-разработки, и первой остановкой станет Angular – этакий строгий немецкий. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru