访问限制在模块化或面向对象的语言中有意义。由于 Basic 最初是一种简单的过程语言,后来添加的此类功能使得使用 Dim、Public 和 Private 的严格规则变得困难。
下面的所有内容都是关于 VBScript(不是 VBA、不是 ASP、不是 VB.NET)
Facts:
- 在子/函数/类代码之外,Dim、Public 和 Private 是等效的:所有声明都适用于全局范围
- 在 Subs/Functions/Methods 中,您只能使用 Dim。这些声明适用于 Func/Sub/Method-local 范围
- 在类定义中,Dimand公共声明可供类外代码访问的变量; Private 创建只能从类代码访问的变量。私有方法只能从类代码中调用,公共方法(默认)可以从“外部空间”调用。
规则集一:
- 使用 Dim 进行顶级声明,因为 Public/Private 没有明显的效果
- Use Dim inSubs/Functions/Method,因为你必须
- 使用 Public 或 Private(但不要 Dim)进行成员变量声明,因为访问权限很重要
- 对私有方法使用 Private,但不要使用 Public,因为它是默认值
示例代码:
Option Explicit
Dim gsDim : gsDim = "gsDim"
Public gsPub : gsPub = "gsPub"
Private gsPriv : gsPriv = "gsPriv"
Class cX
Dim m_sDim
Public m_sPub
Private m_sPriv
Private Sub Class_Initialize()
m_sDim = "m_sDim"
m_sPub = "m_sPub"
m_sPriv = "m_sPriv"
End Sub
Function ToString()
' Public Whatever => syntax error
' Private Whatever => syntax error
Dim Whatever ' => no problem to use Dim for local declaration
ToString = ToStringPriv()
End Function
Private Function ToStringPriv()
ToStringPriv = Join(Array(m_sDim, m_sPub, m_sPriv))
End Function
End Class
Function main()
' Public Whatever => syntax error
' Private Whatever => syntax error
Dim Whatever ' => no problem to use Dim for local declaration
main = 0
WScript.Echo "in func main():", Join(Array(gsDim, gsPub, gsPriv))
Execute "WScript.Echo ""via Execute:"", Join(Array(gsDim, gsPub, gsPriv))"
Dim oX : Set oX = New cX
WScript.Echo "oX.ToString():", oX.ToString()
Dim s
On Error Resume Next
s = oX.ToStringPriv()
WScript.Echo Err.Description
s = oX.m_sPriv
WScript.Echo Err.Description
On Error GoTo 0
End Function
WScript.Echo "top level code:", Join(Array(gsDim, gsPub, gsPriv))
WScript.Quit main()
output:
cscript dimpubpriv.vbs
top level code: gsDim gsPub gsPriv
in func main(): gsDim gsPub gsPriv
via Execute: gsDim gsPub gsPriv
oX.ToString(): m_sDim m_sPub m_sPriv
Object doesn't support this property or method
Object doesn't support this property or method
更新 Kul-Tigin 的评论:
规则集 II(为支持模块的主机编写代码时):
- 将模块视为类,即将 I.3 和 I.4 应用于顶级变量 rsp。子/函数声明(因为现在访问权限很重要/已强制执行)
Code:
Option Explicit
Public gsPub : gsPub = "gsPub"
Private gsPriv : gsPriv = "gsPriv"
Class AContext
Public CodeObject
End Class
With (New AContext)
Set .CodeObject = Me
WScript.Echo .CodeObject.gsPub
WScript.Echo .CodeObject.gsPriv
End With
证据:
cscript dimpubpriv.vbs
gsPub
... Microsoft VBScript runtime error: Object doesn't support this property or method: 'CodeObject.gsPriv''