Являются ли статические локальные переменные плохой практикой?

Связанный вопрос C++: Статические локальные переменные в методах - плохая практика?

В VB.NET, когда мне нужен простой счетчик или что-то, что увеличивается при каждом вызове метода, я часто пишу код вроде:

Private Sub tmrRefresh_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrRefresh.Tick

  Static a As Integer = 0
  a += 1
  '...rest of method depends on a

End Sub

Рекомендуется ли это в VB.NET и ООП в целом?


person Flash    schedule 26.04.2011    source источник
comment
Те же ответы, что и на вопрос С++. Все шаблоны проектирования ООП будут одинаковыми, независимо от языка. В VB.NET нет ничего особенного.   -  person Cody Gray    schedule 26.04.2011
comment
@Cody Но принятый ответ на этот другой вопрос не особенно хорош.   -  person Konrad Rudolph    schedule 26.04.2011
comment
@Cody Достаточно честно - я думал, что два компилятора могут относиться к ним по-разному, а также не смог получить прямой ответ на другой вопрос.   -  person Flash    schedule 26.04.2011
comment
Сейчас старый, но @Cody: Статика в VB.Net — это совсем не то же самое, что статика в C++. Это совершенно разные понятия. Аналогом VB.Net для статики C++ является Shared.   -  person Joel Coehoorn    schedule 25.09.2013


Ответы (2)


Являются ли статические локальные переменные плохой практикой?

Нет. Статические локальные переменные отличаются от нелокальных частных переменных ровно одним: они имеют меньшую область действия. Поскольку вы всегда хотите, чтобы область действия была как можно меньше (= лучшая инкапсуляция), локальная статика может иметь преимущество перед закрытыми переменными.

С другой стороны, локальные статические переменные может быть сложно правильно инициализировать. Если требуется сложная инициализация (например, если вам нужно повторно инициализировать переменную позже), локальные статические переменные могут оказаться неподходящими.

person Konrad Rudolph    schedule 26.04.2011

Я бы НЕ рекомендовал это.

Статический в Visual Basic означает, что одна или несколько объявленных локальных переменных должны продолжать существовать и сохранять свои последние значения после завершения процедуры, в которой они объявлены. Ссылка: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/modifiers/static

Итак, зачем вам это делать? В следующий раз, когда вы войдете в этот Sub, вы все равно повторно инициализируете эту переменную. Я не думаю, что вы даже можете получить к нему доступ, если только у вас не будет второго экземпляра этого класса, и если оба экземпляра запускаются одновременно, значение «а» может повлиять на значение «а» во втором пример. Если бы это не было запланировано, это было бы катастрофой. Как правильно сказано в предыдущем ответе - чем меньше объем, тем лучше.

Итак, если я не ошибаюсь, это была бы очень плохая практика.

person Leo Muller    schedule 24.01.2018