Class 类内常数

Class 类内常数,class,vbscript,constants,Class,Vbscript,Constants,我试图创建一个带有常量的vb脚本类,但得到了800A03EA错误。是VBS错误吗?这不是OOP的基本规则吗 Class customer ' comment it const and its works const MAX_LEN=70 Private Name Private Sub Class_Initialize Name = "" End Sub ' name property. Public Property Get getN

我试图创建一个带有常量的vb脚本类,但得到了800A03EA错误。是VBS错误吗?这不是OOP的基本规则吗

Class customer
   ' comment it const and its works
   const MAX_LEN=70

   Private Name

   Private Sub Class_Initialize
      Name = ""
   End Sub

   ' name property.
   Public Property Get getName
      getName = Name
   End Property

   Public Property Let letName(p_name)
      Name = p_name
   End Property
end class
列出了类上下文中允许的所有语句
Const
不在其中,因此不受支持。您可以通过使用在实例化期间初始化的私有成员变量(即在
Class\u initialize
)来解决此问题:

如果类的实例应公开此值,则可以将其实现为只读属性:

Class customer
  Private MAX_LEN

  Private Sub Class_Initialize
    MAX_LEN = 70
  End Sub

  'read-only property, so no "Property Let/Set"
  Public Property Get MaxLength
    MaxLength = MAX_LEN
  End Property

  ...
End Class
但是,正如正确指出的,值仍然可以由对象内部代码更改。如果不变性是此值的主要要求,则应将其实现为全局常量。

私有变量(可能带有getter)提供的值是从类外部只读的,但类内部代码仍然可以更改该值

因此,在常量最重要的情况下,使用全局常量(可能带有“名称空间”名称部分)可能是一个更好的解决方法。

我同意的,但我想提出另一种选择

如果不变性比性能更重要,那么可以将值直接放在Get中,并使用属性来引用值,而不是类级变量

Class customer

  'read-only property, so no "Property Let/Set"
  Public Property Get MaxLength
    MaxLength = 70
  End Property

  ...
End Class

这是life.IMO的一个(令人遗憾的)事实,说明文档列出了类中可能出现的所有语句有点牵强。我已经阅读了三次文档,但没有任何地方表明该列表是详尽的。我认为一个更准确的说法是,微软通过省略它暗示了这一点。如果是这样的话,那么这就加入了一长串这样的遗漏。这就是为什么不应该让程序员自己编写文档的原因;忽略一些重要的东西是非常容易的。
Class customer

  'read-only property, so no "Property Let/Set"
  Public Property Get MaxLength
    MaxLength = 70
  End Property

  ...
End Class