|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|
Static как в C++22.01.2018, 20:28. Показов 2815. Ответов 37
Метки нет (Все метки)
Мне нужно, чтобы некоторая локальная переменная сохраняла свое значение между вызовами этой функции.
Какой модификатор мне в этом случае надо использовать?
0
|
|
| 22.01.2018, 20:28 | |
|
Ответы с готовыми решениями:
37
Как обратится к non static property из static метода Как вызвать static метод? Обращением из static в не static |
|
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
||
| 22.01.2018, 20:35 | ||
|
1
|
||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|
| 22.01.2018, 20:44 [ТС] | |
|
А вот ещё такой вопрос, верно ли, что время жизни локальной переменной в C# совпадает со временем выполнения функции, в которой она определена. В Visual Basic именно так и происходит, а вот в C++ переменные, которые относятся к автоматическому классу памяти, ну то есть локальные, живут, начиная с момента их определения и умирают, когда управление покидает ту область, в которой они были определены.
Как этот вопрос решается в C#, как в C++ или как в Visual Basic?
0
|
|
|
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
|
| 22.01.2018, 20:48 | |
|
0
|
|
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||
| 22.01.2018, 20:53 [ТС] | ||
|
И кроме того, в одном случае нельзя объявлять ещё одну локальную переменную с таким же самым именем, а в другом случае можно.
0
|
||
|
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
||||||||
| 22.01.2018, 21:07 | ||||||||
0
|
||||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|||||||
| 22.01.2018, 21:14 [ТС] | |||||||
Поэтому, склоняюсь, что в C# время жизни локальной переменной совпадает со временем выполнения функции, в которой она определена, но может быть и ошибаюсь.
0
|
|||||||
|
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
|||||||
| 22.01.2018, 21:29 | |||||||
0
|
|||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||
| 22.01.2018, 21:56 [ТС] | ||
|
Добавлено через 13 минут Ну а если уж быть совсем более точным, то я ищу вот такие две страницы: https://msdn.microsoft.com/uk-... .120).aspx https://msdn.microsoft.com/uk-... .120).aspx Но только для C#.
0
|
||
|
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
||||||
| 22.01.2018, 21:58 | ||||||
|
Просто Саша,
В C++ тоже разный контекст:
0
|
||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|||
| 22.01.2018, 22:11 [ТС] | |||
|
Вы просто объявляете две переменных на одном и том же уровне.
0
|
|||
|
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
|
|||||||
| 22.01.2018, 22:31 | |||||||
|
Вот:
0
|
|||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|
| 22.01.2018, 22:49 [ТС] | |
|
Сам цикл for и переменная определены на одном и том же уровне.
Область видимости, да цикл, но не время жизни. Я о чем хочу сказать, что в С++ все это разложено по полочкам, а здесь как то мутновато. Мне так кажется, все это потому, что ни в C#, ни в Visual Basic нет такого понятия как класс памяти, как в C++. Добавлено через 5 минут В C# - пара фигурных скобок, которые не обозначают составной оператор, например для оператора for, это контекст. А в C++ - нет.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 23.01.2018, 08:40 | ||||||
|
Синтаксически? Да. Фактически в памяти? Может быть, зависит от компилятора и джиттера. То, что в какой-то момент вы смогли увидеть предыдущее значение переменной после повторного входа в контекст (в функцию, например) — случайность, на которую ни в коем случае нельзя полагаться. Из-за таких вещей, как асинхронные методы, методы-итераторы и захваты, переменная может жить более чем одну активацию метода, потому обычными фигурными скобками вопрос не решить.
1
|
||||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||||||||||||
| 23.01.2018, 10:30 [ТС] | ||||||||||||
|
Попробуйте, например, вот такой код
В C# так не получится, но там это не получится из-за того что НЕЛЬЗЯ ИМЕТЬ НЕИНИЦИАЛИЗИРОВАННУЮ ПЕРЕМЕННУЮ, её, конечно и в Basic иметь нельзя, тока в Basic она либо инициализируется значением по умолчанию, либо не инициализируется, если уже определена, но и там и там нельзя иметь вот такое:
0
|
||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||
| 23.01.2018, 10:53 | ||||
|
В шарпе это не получится потому, что семантически переменная в теле цикла объявляется заново на каждой итерации. Когда фактически производится выделение памяти под переменную оставлено на откуп компилятору. В текущей версии майкрософтовского компилятора под десктопные системы все переменные выделяются при входе в метод — как в ВБ. Причина такого правила — избежание дурацких ошибок в коде, а не какие-то технические ограничения.
0
|
||||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
|||
| 23.01.2018, 11:00 [ТС] | |||
|
Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка CS0136 Локальная переменная или параметр с именем "x" нельзя объявить в данной области, так как это имя используется во включающей локальной области для определения локальной переменной или параметра ConsoleApp3 D:\MyProjects\C#\ConsoleApp3\ConsoleApp3 \Program.cs 15 Активный
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 23.01.2018, 11:09 | ||
|
Но вот вывод почему это запрещено вы сделали неправильный: не потому, что переменная "все еще жива", а потому, что такой подход вносит целый ряд проблем с поддержкой и рефакторингом кода. Чисто технически для компилятора нет абсолютно никаких проблем различать внутреннюю и внешнюю переменные как разные сущности — масса компиляторов с этим прекрасно справляется. Причина — семантика, а не проблемы в реализации.
0
|
||
|
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
|
||
| 23.01.2018, 11:17 [ТС] | ||
|
В конце-концов, результат конечный от этого не меняется. Тем более, что ведет себя этот код точно также как и Visual Basic, а в Visual Basic это объясняется именно так.
0
|
||
| 23.01.2018, 11:17 | |
|
Помогаю со студенческими работами здесь
20
Как закрыть и открыть форму в методе static? Как вызвать static метод из типа dynamic Получить доступ к методам "internal static" находящимся в класе "internal static class" Как в Button17 объявить делегат на методы класса static string toString (Complex A) Как исправить ошибку "Program does not contain a static 'Main' method" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|