|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|
Static как в C++22.01.2018, 20:28. Показов 3091. Ответов 37
Метки нет (Все метки)
Мне нужно, чтобы некоторая локальная переменная сохраняла свое значение между вызовами этой функции.
Какой модификатор мне в этом случае надо использовать?
0
|
|
| 22.01.2018, 20:28 | |
|
Ответы с готовыми решениями:
37
Как обратится к non static property из static метода Как вызвать static метод? Обращением из static в не static |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||||
| 23.01.2018, 11:29 | |||||||||
|
Но, согласитесь, простота в ущерб правильности — не всегда лучший подход.
Области там определяются синтаксическими конструкциями (циклы, условия, методы, модули и т.д.), при этом логично иметь возможность объявлять переменную только в определенной области. Поэтому, наверное, и сделали такое поведение локальным.
1
|
|||||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|||
| 23.01.2018, 11:47 [ТС] | |||
|
Добавлено через 9 минут И к тому же речь ведь идёт о времени жизни таких переменных, просто в первом случае её существование не позволяет определить другую переменную с таким же именем, а во втором случае позволяет, потому что она находится в другом контексте. Просто, удобно и красиво. ДА НЕПРАВИЛЬНО, но эта неправильность важна только разработчикам компилятором, но не прикладных программ.
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||
| 23.01.2018, 11:57 | ||||||||
|
Контекст — он и есть контекст, в том числе и для оператора for. Без операторов, просто с пустыми областями этот код будет работать (не работать) точно так же — правила одни и те же.
Время жизни переменной влияет на такой важнейший параметр, как время жизни объекта, на который эта переменная ссылается. Если переменная ссылочного типа. Используя ваше определение становится практически невозможным отслеживать в какой момент на объект не остается ссылки и производить соответствующий рефакторинг.
0
|
||||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||
| 23.01.2018, 12:08 [ТС] | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 23.01.2018, 12:10 | ||
|
0
|
||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||
| 23.01.2018, 12:30 [ТС] | ||
|
Мы с таким же успехом можем говорить, что переменная вне цикла не дает определить внутри цикла переменную с таким же именем. В Visual Basic это объясняется так. Поэтому я и заимствовал это объяснение оттуда. В конце концов должен быть какой-то критерий существования или несуществования переменной с тем или иным именем. Ну не может же быть так, что если переменной нет, а другую переменную с таким именем определить нельзя. Ну здесь как минимум, все таки что-то от нее остается. Ну во всяком случае не так примитвно, как будто её никода не было.
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 23.01.2018, 12:50 | |||||||
![]() Но представлять таким образом время жизни переменных в шарпе — плохая идея, потому что может привести к неправильному подходу и повлиять на корректность кода. Время жизни переменной — это свойство переменной во время выполнения программы. Область видимости и возможность объявления — это синтаксис, свойство текста программы. Они немного разные вещи. Я выше уже говорил, что майкрософтовский компилятор по факту выделяет память подо все локальные сразу при входе в метод. Но не его поведение является причиной наличия такого правила (было странно, если бы это было так), а наличие такого правила позволяет компилятору выполнять некоторые оптимизации. А причина самого правила проста: устранение целого ряда проблем с неподдерживаемым кодом, который наблюдается в других языках, где это разрешено. Время жизни тут вообще никаким боком. Например, любой компилятор, реализующий спек шарпа, имеет полное право выделять и удалять память под переменную на каждой итерации цикла. Но ни один компилятор не имеет права нарушать правило, запрещающее создание двух локальных с одинаковым именем в пересекающихся областях видимости. Опять же, для компилятора нет никаких проблем или технических ограничений обозвать внутреннюю переменную x1, а внешнюю — x2. Причина не в жизни переменных, а в спецификации языка, прямо запрещающей создание одинаковых локальных в пересекающихся областях.Вон, в С++ такого правила нет и компилятор может вообще использовать ту же самую переменную что во внешней, что во внутренней области. А может и не использовать и каждый раз увеличивать/уменьшать указатель на стеке.
0
|
|||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||||
| 23.01.2018, 12:58 [ТС] | ||||
|
Кстати, все это можно не раз обсуждать, но жизнь была бы значительно проще
Осталось только выяснить, что означает переменная живет или не живет.
0
|
||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 23.01.2018, 13:06 | ||||||
|
0
|
||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|||||||||
| 23.01.2018, 13:25 [ТС] | |||||||||
И еще, можно пользоваться и нельзя пользоваться - здесь это не антитезы. Например, статическими локальными переменными в C++ можно пользоваться только внутри функций, в которых они определены, но живут они с начала программы и до ее конца. Добавлено через 5 минут Поэтому, период выполнения чего-то, откуда данная переменная не видна, отнюдь не относится к ее времени жизни. Добавлено через 8 минут Поэтому, если резюмировать все, что только сказано выше. В C++ время жизни переменной x - область цикла, область видимости та же самая область этого цикла. А вот в C# - время жизни переменной x - вся функция, в которой все это происходит, ну по крайней мере пара фигурных скобок, обрамляющих этот цикл, а область действия все та же самая область цикла. Вроде все логично.
0
|
|||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||||
| 23.01.2018, 13:45 | ||||||||||
|
Если под временем жизни вы подразумеваете наличие какого-то значения в каком-то участке памяти, то это как правило дается на откуп компилятору и к языку как таковому уже отношения не имеет. То есть локальная, объявленная внутри цикла, условия или просто блока, по всем наблюдаемым эффектам должна считаться дохлой по выходе из этого цикла.
А новую переменную с таким именем вы не создадите потому, что это запрещают правила языка, а не потому, что она уже где-то существует. Ошибка выше явно указывает на то, что она не существует ![]() Добавлено через 1 минуту Но спецификация языка не накладывает такого обязательства.
0
|
||||||||||
|
|
||
| 23.01.2018, 14:15 | ||
|
0
|
||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||||
| 23.01.2018, 14:23 [ТС] | ||||
|
Добавлено через 4 минуты В Ваших спеках действительно говорится, что переменная не существует после выхода из цикла, а вот то, что внешняя к циклу переменная не позволяет определять переменную с таким же самым именем, не говорится ничего. ХОТЯ МОЖЕТ БЫТЬ Я ПРОСТО ЕЩЁ НЕ ДОШЕЛ ДО ЭТОГО МЕСТА И МОЖЕТ БЫТЬ ПРАВИЛЬНЫЙ ОТВЕТ Я ПОЛУЧУ ТАМ, ГДЕ РЕЧЬ ПОЙДЕТ О СКРЫТИЕ ИМЕН.
0
|
||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 23.01.2018, 14:59 | |||||
|
Косвенно можно проверить удаление объекта сборщиком, ссылку на который присвоили локальной переменной цикла. Если после цикла объект удалился, то ссылки на него больше нет и формально переменная мертва. Но тут другая заморочка: даже если ссылки и нет, то сборщик не обязан подчищать память сию же секунду ![]()
![]()
0
|
|||||
|
|
|
| 23.01.2018, 15:00 | |
|
Просто Саша, еще раз -- все переменные метода, где бы ты их не написал, в итоговой сборке будут в начале метода.
Далее, если бы ти посмотрел на ошибки, то ругается не на ниже обьявленую переменую, а во внутренем контексте. Т.е. Контекст должен иметь свои уникальные переменые, по отношению к внешнему (не путать с соседним). Если читать общую документацию, там напрямую это не разьясняется, но логично, что если переменая есть ниже, значит она находится во всем текущем контексте. А учитывая, что с goto можно гулять по всем частям кода.... p.s. и зачем строчить капсом?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 23.01.2018, 15:07 | ||
|
Просто Саша, вот еще по поводу жизни переменной, из спека:
Освобождать память или нет после окончания блока — прерогатива компилятора. Ну мы уже знаем, что МС-овский компилятор не освобождает.
0
|
||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||
| 23.01.2018, 15:59 [ТС] | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 23.01.2018, 16:25 | ||
![]() Точно так же, как в шарпе нельзя объявлять функции вне класса, нельзя и объявлять переменные с одинаковыми именами в пересекающихся областях. У каждого языка свои особенности.
0
|
||
| 23.01.2018, 16:25 | |
|
Как закрыть и открыть форму в методе static? Как вызвать static метод из типа dynamic Получить доступ к методам "internal static" находящимся в класе "internal static class" Как в Button17 объявить делегат на методы класса static string toString (Complex A) Как исправить ошибку "Program does not contain a static 'Main' method" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|