Visual Basic поддерживает два основных способа объявления неизменяемых значений — Const и ReadOnly. Const предназначен для компиляторных констант, значение которых известно на этапе компиляции. ReadOnly допускает инициализацию только в момент объявления или в конструкторе и поддерживает неизменяемость во время исполнения.
Исторически еще с VB6 и ранее подобная семантика позволяла избегать магических чисел и облегчала сопровождение. В VB.NET возможности были расширены с введением ReadOnly для полей экземпляра и класса.
Если использовать Const для значений, которые определяются во время выполнения или зависят от внешних данных, могут возникнуть ошибки. Перепутанные области видимости тоже ведут к багам.
Используйте Const для простых неизменяемых значений (чисел, строк), известных на момент компиляции, а ReadOnly для случаев, когда значение может рассчитываться в конструкторе, но после — только для чтения.
Пример кода:
Public Class MathConstants Public Const Pi As Double = 3.1415926535 Public ReadOnly Property UtcCreated As DateTime Public Sub New() UtcCreated = DateTime.UtcNow End Sub End Class
Ключевые особенности:
Можно ли объявить Const для значения, получаемого в рантайме (например, из файла)?
Нет — Const требует значения на момент компиляции. Для рантайм-инициализации следует использовать ReadOnly.
Может ли ReadOnly поле быть изменено после конструктора?
Нет — изменение возможно только в момент инициализации (либо при объявлении, либо в конструкторе), далее оно доступно только для чтения.
Следует ли использовать Const для чисел float/double при математических расчетах?
Да, если значение известно заранее. Но при использовании в других сборках изменение значения Const потребует перекомпиляции всех зависимых модулей, поскольку компилятор встраивает значение напрямую.
Разработчик объявил Const для пути к папке, который позже должен был быть изменен в разных средах (dev/prod). В результате при изменении папки требовалось пересобрать все проекты, использующие этот Const.
Плюсы:
Минусы:
Реализовали ReadOnly для путей, инициализировали в конструкторе с учетом конфигурации среды. Значения легко поддаются изменению через настройки без пересборки всего приложения.
Плюсы:
Минусы: