Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375

Static как в C++

22.01.2018, 20:28. Показов 2815. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно, чтобы некоторая локальная переменная сохраняла свое значение между вызовами этой функции.
Какой модификатор мне в этом случае надо использовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2018, 20:28
Ответы с готовыми решениями:

Как обратится к non static property из static метода
День добрый, сразу вопрос static - как правильно статический или статичный? У меня есть некий метод, у которого есть статичный метод...

Как вызвать static метод?
Здравствуйте, есть у меня например такое: class Example { static void Main(string arg) { } } static class Ex ...

Обращением из static в не static
Есть у меня метод static Class2 d = new Class2(); public static void cc2(List args) { ClassLibrary1.Class3 s =...

37
Эксперт .NET
 Аватар для Даценд
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
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
22.01.2018, 20:48
Цитата Сообщение от Просто Саша Посмотреть сообщение
время жизни локальной переменной в C# совпадает со временем выполнения функции, в которой она определена. В Visual Basic именно так и происходит, а вот в C++ переменные, которые относятся к автоматическому классу памяти, ну то есть локальные, живут, начиная с момента их определения и умирают, когда управление покидает ту область, в которой они были определены.
А в чем разница?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
22.01.2018, 20:53  [ТС]
Цитата Сообщение от Даценд Посмотреть сообщение
А в чем разница?
Ну наверно разница в том, что следующий раз, когда управление войдет в область, в которой эта переменная определена, в одном случае она сохранит свое прежнее значение, а во втором нет.
И кроме того, в одном случае нельзя объявлять ещё одну локальную переменную с таким же самым именем, а в другом случае можно.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
22.01.2018, 21:07
Цитата Сообщение от Просто Саша Посмотреть сообщение
что следующий раз, когда управление войдет в область, в которой эта переменная определена, в одном случае она сохранит свое прежнее значение, а во втором нет.
Ни в C#, ни в C++ (не static) локальные переменные не сохраняют значения.
Цитата Сообщение от Просто Саша Посмотреть сообщение
в одном случае нельзя объявлять ещё одну локальную переменную с таким же самым именем, а в другом случае можно.
Можно и в C# и в C++. Например:
C#
1
2
3
4
5
6
7
8
9
10
11
void fun()
{
    for (int i = 0; i < 5; i++) //i
    {
        int x = i; //объявили x в одной области
    }
    for (int i = 0; i < 5; i++)//еще i
    {
        int x = i; //x в другой области
    }
}
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
22.01.2018, 21:14  [ТС]
Цитата Сообщение от Даценд Посмотреть сообщение
Можно и в C# и в C++. Например:
В предыдущем посту я забыл упомянуть В ОДНОМ И ТОМ ЖЕ КОНЕКСТЕ, то есть имелось в виду,, что в C++ вот так можно

C++
1
2
3
4
5
for (int i = 0; i < 5; i++)//еще i
    {
        int x = i; //x в другой области
    }
int x = 1;
а в C# - нельзя

Поэтому, склоняюсь, что в C# время жизни локальной переменной совпадает со временем выполнения функции, в которой она определена, но может быть и ошибаюсь.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
22.01.2018, 21:29
Цитата Сообщение от Просто Саша Посмотреть сообщение
а в C# - нельзя
со скобками можно:
C#
1
2
3
4
5
6
7
8
9
10
void fun()
{
    for (int i = 0; i < 5; i++)//еще i
    {
        int x = i; //x в другой области
    }
    {
        int x = 1;
    }
}
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
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
22.01.2018, 21:58
Просто Саша,
В C++ тоже разный контекст:
C++
1
2
3
4
5
6
void fun()
{
    for (int i = 0; i < 5; i++)
        int x = i;
    double x = 1;
}
Или что такое контекст?
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
22.01.2018, 22:11  [ТС]
Цитата Сообщение от Даценд Посмотреть сообщение
Или что такое контекст?
То же самое, что область видимости.

Цитата Сообщение от Даценд Посмотреть сообщение
В C++ тоже разный контекст:
Нет в C++ это один и тот же контекст, да и не только в C++, но и в C#.
Вы просто объявляете две переменных на одном и том же уровне.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
22.01.2018, 22:31
Цитата Сообщение от Просто Саша Посмотреть сообщение
две переменных на одном и том же уровне.
Да на разном же: int x в цикле (область видимости - цикл), double x за циклом в функции (кроме цикла, там - локальная x цикла).
Вот:
C++
1
2
3
4
5
6
7
8
9
10
void fun()
{
    double x = 42;
    for (int i = 0; i < 5; i++)
    {
        int x = i;
        std::cout << x << std::endl;
    }
    std::cout << x << std::endl;
}
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
22.01.2018, 22:49  [ТС]
Сам цикл for и переменная определены на одном и том же уровне.
Область видимости, да цикл, но не время жизни.
Я о чем хочу сказать, что в С++ все это разложено по полочкам, а здесь как то мутновато.
Мне так кажется, все это потому, что ни в C#, ни в Visual Basic нет такого понятия как класс памяти, как в C++.

Добавлено через 5 минут
В C# - пара фигурных скобок, которые не обозначают составной оператор, например для оператора for, это контекст.
А в C++ - нет.
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
23.01.2018, 05:56
вы точно разговариваете о Static как в C++ ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.01.2018, 08:40
Цитата Сообщение от Просто Саша Посмотреть сообщение
верно ли, что время жизни локальной переменной в C# совпадает со временем выполнения функции, в которой она определена.
Смотря о каком времени жизни идет речь.
Синтаксически? Да.
Фактически в памяти? Может быть, зависит от компилятора и джиттера.

Цитата Сообщение от Просто Саша Посмотреть сообщение
разница в том, что следующий раз, когда управление войдет в область, в которой эта переменная определена, в одном случае она сохранит свое прежнее значение, а во втором нет.
Какой пункт спецификации языка C++ это гарантирует, если речь идет не о статических локальных? (подсказка: никакой).
То, что в какой-то момент вы смогли увидеть предыдущее значение переменной после повторного входа в контекст (в функцию, например) — случайность, на которую ни в коем случае нельзя полагаться.

Цитата Сообщение от Просто Саша Посмотреть сообщение
в C++ вот так можно, а в C# - нельзя
Поэтому, склоняюсь, что в C# время жизни локальной переменной совпадает со временем выполнения функции, в которой она определена
Такое поведение связано не со временем жизни переменной, а с желанием разработчиков языка устранить класс проблем, в которых две переменных с одинаковым именем имеют разную цель.

Цитата Сообщение от Просто Саша Посмотреть сообщение
я ищу вот такие две страницы
Раздел 3.7 спецификации.

Цитата Сообщение от Просто Саша Посмотреть сообщение
Я о чем хочу сказать, что в С++ все это разложено по полочкам, а здесь как то мутновато.
Потому что время жизни переменной зависит от времени ее использования.
Из-за таких вещей, как асинхронные методы, методы-итераторы и захваты, переменная может жить более чем одну активацию метода, потому обычными фигурными скобками вопрос не решить.
1
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
23.01.2018, 10:30  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
разница в том, что следующий раз, когда управление войдет в область, в которой эта переменная определена, в одном случае она сохранит свое прежнее значение, а во втором нет.
Здесь речь идет не о C++, а о Visual Basic
Попробуйте, например, вот такой код

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub Main(ByVal args() As String)
        Dim n As Integer = 1
 
        For n = 1 To 12 Step 1
            Console.Write(n.ToString() & " До ")
            Dim cube As Double
            Console.WriteLine(cube)
            cube = n ^ 3
            Console.Write(n.ToString() & " После ")
            Console.WriteLine(cube)
            Console.WriteLine()
        Next
        Console.ReadLine()
    End Sub
и убедитесь, что переменная cube сохраняет свое значение между отдельными итерациями этого цикла.
В C# так не получится, но там это не получится из-за того что НЕЛЬЗЯ ИМЕТЬ НЕИНИЦИАЛИЗИРОВАННУЮ ПЕРЕМЕННУЮ, её, конечно и в Basic иметь нельзя, тока в Basic она либо инициализируется значением по умолчанию, либо не инициализируется, если уже определена, но и там и там нельзя иметь вот такое:

C#
1
2
3
4
5
for (int i = 0; i < 5; i++)//еще i
    {
        int x = i; //x в другой области
    }
int x = 1;
Вроде согласно спецификациям переменная x, та которая внутри цикла имеет SCOPE, совпадающий с блоком, в котором она определена (НУ ПРЯМ КАК В C++), но почему тогда при выходе из цикла она не умирает и не позволяет определить другую переменную с тем же самым именем. Ответ только один - ЗНАЧИТ ОНА НЕ УМИРАЕТ, А ПРОДОЛЖАЕТ ЖИТЬ, и хотя обратиться к ней нельзя (НЕ ТА ОБЛАСТЬ ВИДИМОСТИ), но это другой вопрос, но она все же есть.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.01.2018, 10:53
Цитата Сообщение от Просто Саша Посмотреть сообщение
Здесь речь идет не о C++, а о Visual Basic
С ВБ не достаточно знаком, потому не могу судить — является такое поведение соответствием спеку или просто деталь реализации компилятора.

Цитата Сообщение от Просто Саша Посмотреть сообщение
В C# так не получится, но там это не получится из-за того что НЕЛЬЗЯ ИМЕТЬ НЕИНИЦИАЛИЗИРОВАННУЮ ПЕРЕМЕННУЮ
Не совсем по этой причине.
В шарпе это не получится потому, что семантически переменная в теле цикла объявляется заново на каждой итерации.
Когда фактически производится выделение памяти под переменную оставлено на откуп компилятору.
В текущей версии майкрософтовского компилятора под десктопные системы все переменные выделяются при входе в метод — как в ВБ.

Цитата Сообщение от Просто Саша Посмотреть сообщение
почему тогда при выходе из цикла она не умирает и не позволяет определить другую переменную с тем же самым именем. Ответ только один - ЗНАЧИТ ОНА НЕ УМИРАЕТ, А ПРОДОЛЖАЕТ ЖИТЬ
Вывод неправильный.
Причина такого правила — избежание дурацких ошибок в коде, а не какие-то технические ограничения.
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
23.01.2018, 11:00  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Вывод неправильный.
Цитата Сообщение от kolorotur Посмотреть сообщение
Вывод неправильный.
Причина такого правила — избежание дурацких ошибок в коде, а не какие-то технические ограничения.
ВОТ ЧТО ПИШЕТ ДОСЛОВНО:

Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка CS0136 Локальная переменная или параметр с именем "x" нельзя объявить в данной области, так как это имя используется во включающей локальной области для определения локальной переменной или параметра ConsoleApp3 D:\MyProjects\C#\ConsoleApp3\ConsoleApp3 \Program.cs 15 Активный
0
Эксперт .NET
 Аватар для kolorotur
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  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Но вот вывод почему это запрещено вы сделали неправильный:
Так проще объяснять такое поведение.
В конце-концов, результат конечный от этого не меняется.
Тем более, что ведет себя этот код точно также как и Visual Basic, а в Visual Basic это объясняется именно так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2018, 11:17
Помогаю со студенческими работами здесь

Как закрыть и открыть форму в методе static?
Пытаюсь в методе public static void закрыть текущую форму и открыть новую. Использую следующий код: using (var f = new Form2()) f.Hide();...

Как вызвать static метод из типа dynamic
К примеру есть класс в одной программе: namespace ConsApp_VerifyText { public class TextHelper { ///...

Получить доступ к методам "internal static" находящимся в класе "internal static class"
Спасибо что заглянул. Суть вопроса, не могу понять как вызвать метод в защищённом классе, с публичными классами и приватными методами в...

Как в Button17 объявить делегат на методы класса static string toString (Complex A)
Доврый день! using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...

Как исправить ошибку "Program does not contain a static 'Main' method"
Просто взял и переписал пример из книги Шилдт.Г С#4.0 полное руководство ,вот пример using System; class Game { static void...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через 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. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru