Visual Basic支持两种主要的声明不可变值的方式——Const和ReadOnly。Const用于编译时常量,其值在编译阶段已知。ReadOnly只允许在声明时或构造函数中初始化,并在运行时保持不可变。
从VB6及更早期开始,这种语义帮助避免魔法数字并简化了维护。在VB.NET中,引入ReadOnly用于实例和类的字段,扩展了这些功能。
如果对在运行时确定的值或依赖于外部数据的值使用Const,可能会导致错误。混淆的可见性范围也会导致bug。
对于在编译时已知的简单不可变值(数字、字符串),使用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吗?
可以,如果值已知。但在其他程序集中的使用,改变Const的值需要重新编译所有依赖模块,因为编译器会直接嵌入值。
开发者为一个文件夹路径声明了Const,该路径后来需要在不同的环境中(开发/生产)进行更改。结果,在更改文件夹时,需要重新构建所有使用该Const的项目。
优点:
缺点:
为路径实现了ReadOnly,在构造函数中根据环境配置进行初始化。通过设置轻松改变值,而无需重新构建整个应用程序。
优点:
缺点: