В Visual Basic переменные внутри процедур обычно теряют значение после завершения вызова. Ключевое слово Static позволяет переменной сохранять своё значение между вызовами процедуры.
История вопроса:
В классическом Visual Basic (VB6) и VB.NET Static часто использовался для создания счетчиков и флагов без использования полей класса или модуля.
Проблема:
Разработчик может использовать обычные локальные переменные, рассчитывая на их "устойчивость", тогда как они обнуляются при каждом вызове. С другой стороны, выбранное место (тело процедуры или блок кода) для статической переменной может быть ошибочным.
Решение:
Объявите переменную с помощью Static внутри процедуры. Она инициализируется один раз при первом вызове процедуры, затем сохраняет своё значение между вызовами.
Пример кода:
Sub CountCalls() Static counter As Integer = 0 counter += 1 Console.WriteLine($"Вызов номер: {counter}") End Sub ' Вызовы вызовут разные значения CountCalls() ' 1 CountCalls() ' 2 CountCalls() ' 3
Ключевые особенности:
Static существует только в области видимости процедуры, но сохраняет значение между вызовамиЧем отличается Static в процедуре от поля класса с модификатором Shared?
Static переменная действует только в данной процедуре — каждый экземпляр метода получает свою независимую статическую переменную. Shared поле класса одно на весь класс.
Можно ли объявить Static переменную в блоке For или If?
Нет, Static переменные объявляются только на верхнем уровне процедуры, не допускается внутри вложенных блоков (For, If).
Что произойдет при вызове процедуры с Static из нескольких потоков?
В версии VB.NET область Static переменных привязана к каждому потоку, что может вызывать race condition и неожиданные значения при многопоточном вызове.
В процедуре расчета реакции пользователя нажатия клавиши используют Static для хранения времени срабатывания, но не учитывают одновременное нажатие несколькими пользователями (например, веб-приложение или многопоточное окно).
Плюсы:
Минусы:
Static используется для хранения внутреннего счетчика вызовов утилитарного метода, вызываемого только синхронно из одного потока.
Плюсы:
Минусы: