TL; DR
Option Strict
и Option Explicit
помогут вам поймать потенциальных и фактических ошибок при времени разработки , а не при компиляции и сбое кода на выполнения . Вы должны переключить оба On
Option Strict и Option Explicit по умолчанию отключены. Чтобы включить их:
Вариант Строгий
Tools -> Options -> Projects and Solutions -> VB defaults -> Option Strict
. Установите On
.
Параметр Явный
Tools -> Options -> Editor -> Require Variable Declaration
. отметьте это.
Параметр Явный
При Option Explicit Off вам не нужно объявлять (Dim) переменную перед ее использованием:
a = 123 'a is automatically declared as an Integer
Это становится опасным, когда вы объявляете переменную в одном месте и думаете, что используете ее позже, но неправильно вводите ее:
Dim counter As Integer = 0
'some lines later...
countr = 55 'This creates a new variable called countr
Или, что еще хуже, вы присваиваете значение переменной, которая, как вы думаете, находится в области видимости, но это не так, и в итоге вы объявляете новую переменную с тем же именем, но другой областью действия. *
При большом количестве кода или длинных методов их можно легко не заметить. Всегда включайте его, чтобы избежать подобных проблем
Вариант строгий
При Option Strict Off вы можете неявно преобразовывать тип данных в тип сужения без ошибок
Dim d As Double = 999.99
Dim s As Single = d 'No error with Option Strict Off
В этих случаях Option Strict предупреждает разработчика о том, что значение double никогда не должно превышать Single.MaxValue
Вы также можете присвоить Enum неправильное значение без ошибок. Ниже приведен реальный пример этого:
Переменная должна была быть установлена на EOpticalCalStates.FAILED
(24), фактически она устанавливает для State значение 4, которое эквивалентно EOpticalCalStates.ALI_HOR
Что-то подобное не так легко определить.
Поэтому по умолчанию вы всегда должны иметь Option Strict. Этот параметр должен быть установлен по умолчанию, но Microsoft решила оставить его выключенным, чтобы увеличить обратную совместимость (что задним числом было ошибкой IMO)