2013-11-18 4 views
0

Это скорее изменение, но я хочу быть уверенным, прежде чем начать менять старый код, чтобы очистить его.Объявление констант за пределами подпрограммы

Если у вас есть частные varibales, объявленные внутри модуля, но вне подпрограммы, когда они фактически созданы. Например, это как модуль устанавливается:

'Local objects..... 
'Function Main..... 
'Subroutines....... 
Private Constants.. 
Private variables.. 
More Subroutines... 

Если эти переменные используются только в одной подпрограмме, они должны быть объявлены внутри этой подпрограммы или в локальных объектах или прямо перед подпрограммой, как сейчас ?

Спасибо!

+0

Не зная, как эти переменные используются, невозможно сказать. Являются ли значения переменных сброшены/очищены каждый раз при вызове методов? Или это значение, оставшееся после предыдущего вызова, потребляемого следующим вызовом метода? –

ответ

3

CLR не поддерживает модули или переменные модуля, поэтому модули становятся статическими классами, а переменные модуля становятся статическими.

Как правило, переменные следует указывать как можно ближе к точке, в которой они используются. Их объем также должен быть максимально ограниченным.

Включение переменной в поле является довольно порочная практика кодирования по нескольким причинам:

  • Это очень легко сделать ошибку и повторно использовать то же поле в другой части вашего модуля, создавая неожиданные условия.
  • Значительное увеличение времени жизни объектов в переменной. Как правило, после выхода из метода переменная доступна для сбора мусора. Перевернув его в статическое поле, объект останется в живых до тех пор, пока он не будет заменен или приложение не закончит
  • Несколько потоков смогут видеть и получать доступ к одному и тому же статическому полю, что потенциально создает условия гонки. Учитывая, сколько вещей работает в настоящее время, это может быть серьезной проблемой.
+0

Пока ваши баллы действительны, вы, кажется, делаете предположение, что значение поля не должно сохраняться между вызовами, которые OP не делает ясным. Например, если у меня есть целое число numberOfTimesCalled, которое увеличивается для каждого вызова, это должно быть абсолютно полем, а не локальным. Следуя этим советам, слепо может вызвать разрыв в логике приложений! –

+0

Вы предполагаете, что только один вызывающий абонент коснется этого * статического * поля, и нет никаких шансов, что какой-то другой вызов найдет это значение случайно. Сохраняющееся состояние в статических полях подвержено ошибкам и гораздо более вероятно приведет к неожиданному поведению. Легче передать состояние как объект состояния. Это также упрощает расширение кода, например, с помощью базы данных или кеша в будущем, чтобы сохранить несколько значений или протестировать его, не беспокоясь о утечке данных с одного сеанса на следующий –

+1

От @PanagiotisKanavos: «Как правило, переменные должны быть объявлены как близко к той точке, в которой они используются, насколько это возможно. Их охват также должен быть максимально ограниченным ». Это ответ. – djv

Смежные вопросы