Classic ASP中Dim和Public有什么区别?

时间:2014-05-28 11:08:27

标签: vbscript asp-classic

今天提出了关于范围的问题,这让我想到了。

我一直都了解VBScript范围以及如何在全球和本地声明。我想到,虽然我从不使用Public变量,但在全局声明时往往会使用Dim

据我所知DimPublic相同,但如果是这样的话,为什么同时拥有它们?两者之间是否存在差异,使用其中一种是不错的做法?


  

更新

     

这个问题纯粹是针对VBScript,而不是VBA,特别是在经典ASP的背景下。

     

1 个答案:

答案 0 :(得分:16)

访问限制在模块化或面向对象语言中有意义。由于Basic是一种简单的过程语言,后来添加这些功能会严格限制使用Dim,Public和Private。

以下所有内容都是关于VBScript(不是VBA,不是ASP,不是VB.NET)

事实:

  1. 在Sub / Function / Class代码中,Dim,Public和Private是等效的:所有声明都适用于全局范围
  2. 在Subs / Functions / Methods中,您只能使用Dim。声明适用于Func / Sub / Method-local scope
  3. 在类定义中,Dim 公共声明变量,这些变量可用于outs-classe代码; Private创建的变量只能从类代码访问。私有方法只能从类代码中调用,公共方法(默认)可以从'外层空间调用。
  4. 规则集I:

    1. 将Dim用于顶级声明,因为公共/私有没有明显的效果
    2. 在子/功能/方法中使用Dim ,因为您必须
    3. 对成员变量声明使用Public或Private(但不是Dim),因为访问权限很重要
    4. 对私人方法使用私有,但不要打扰公开,因为它是默认的
    5. 示例代码:

      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()
      

      输出:

      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(为支持模块的主机编写代码时):

      1. 将模块视为类,即将I.3和I.4应用于顶级变量rsp。子/函数声明(因为现在访问权限很重要/被强制执行)
      2. 代码:

        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''