暗淡和公共有什么区别?

2024-04-18

今天提出了一个关于范围的问题,这引起了我的思考。

我一直了解 VBScript 范围以及如何声明全局和本地。我突然想到我从来没有使用过Public变量但倾向于使用Dim相反,在全局声明时。

据我了解Dim是相同的Public,但如果是这样的话,为什么要同时拥有它们呢?两者之间有区别吗?使用其中之一是否是一种好的做法?


Update:

这个问题纯粹针对 VBScript,而不是 VBA,尤其是在经典 ASP 的上下文中。

  • Visual Basic for Applications 和 VBScript 之间的主要区别 http://msdn.microsoft.com/en-us/library/ms970436.aspx

访问限制在模块化或面向对象的语言中有意义。由于 Basic 最初是一种简单的过程语言,后来添加的此类功能使得使用 Dim、Public 和 Private 的严格规则变得困难。

下面的所有内容都是关于 VBScript(不是 VBA、不是 ASP、不是 VB.NET)

Facts:

  1. 在子/函数/类代码之外,Dim、Public 和 Private 是等效的:所有声明都适用于全局范围
  2. 在 Subs/Functions/Methods 中,您只能使用 Dim。这些声明适用于 Func/Sub/Method-local 范围
  3. 在类定义中,Dimand公共声明可供类外代码访问的变量; Private 创建只能从类代码访问的变量。私有方法只能从类代码中调用,公共方法(默认)可以从“外部空间”调用。

规则集一:

  1. 使用 Dim 进行顶级声明,因为 Public/Private 没有明显的效果
  2. Use Dim inSubs/Functions/Method,因为你必须
  3. 使用 Public 或 Private(但不要 Dim)进行成员变量声明,因为访问权限很重要
  4. 对私有方法使用 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(为支持模块的主机编写代码时):

  1. 将模块视为类,即将 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''
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

暗淡和公共有什么区别? 的相关文章

  • SQL服务器超时

    我的应用程序是在经典 asp 上开发的 但也使用 asp net 因为我正在将应用程序迁移到 Net 上 它使用 SQL Server 作为数据库并托管在 Windows Server 2003 上 现在的问题是应用程序在很长一段时间内继续
  • ZURB Foundation,以编程方式切换选项卡

    我使用 asp 与基础 有没有办法使用 JS 或 ASP 在一个选项卡之间切换到另一个选项卡 Link http foundation zurb com docs tabs php 简单选项卡 一个可能的解决方案是为选项卡链接分配一个 id
  • 在 C# 中转换 VbScript 函数(Right、Len、IsNumeric、CInt)

    同样 我在 VbScript 中得到了以下代码 您能建议一下 C 中的等效代码吗 Function GetNavID Title getNavID UCase Left Title InStr Title 1 End Function 我已
  • 从 VBS 运行同一目录中的批处理文件

    我有一个 VBScript 应该运行 bat 或 vbs 文件 但它不起作用 它出现一个错误 指出无法找到该文件 无论我是否放入文件路径 我认为这并不重要 因为它位于同一目录中 所以我的问题是 如何从 VBScript 中启动 bat 文件
  • ADODB.Parameters 错误“800a0e7c”参数对象定义不正确。提供的信息不一致或不完整

    我主要是一名 PHP 开发人员 但我有一些旧的 ASP 我们以前的开发人员之一制作的它坏了 我不知道如何修复它 我们有一个程序 将一些变量发送到侦听器页面 该侦听器页面将该数据与 msSQL 数据库中的注册代码进行比较 然后让程序知道注册代
  • 在经典 ASP 中的应用程序范围内使用字典对象

    跟进自我的最后一个问题 https stackoverflow com questions 909808 how can i make a variable static or global in classic asp有谁知道如何在经典
  • 自动递增asp控件ID

    我怎样才能做相当于 经典 ASP a href somelink com Link a C
  • 将 SQL 变量传递给 ASP

    这里只是有点语法问题 我正在使用 SQL 和 ASP 并且到目前为止有以下代码 set rs Server CreateObject ADODB recordset rs Open Select from Questions conn sq
  • Google Chrome 总是说“Google Chrome 没有正确关闭”[重复]

    这个问题在这里已经有答案了 我在 VBS 文件脚本中使用此代码自动关闭 Chrome 浏览器 Set objExec browobj Exec tasklist fi Chr 34 imagename eq chrome exe Chr 3
  • GetRef 来捕获方法?

    我刚刚发现了 VBScript 的 GetRef 函数 它获取对其参数命名的函数的引用 有没有办法以这种方式获取对方法的引用 我有一种预感 VBScript 不提供这样做所需的复杂绑定 但它肯定会很好 No GetRef不支持类方法
  • 将 ADODB.RecordSet 输出为 JSON

    我正在尝试更改我的应用程序 以便它输出 JSON 而不是 HTML当它发出 AJAX 请求某些数据时 我有一个 ADODB 记录集 我需要逐行循环它并添加 更改 删除不同的值 然后我需要获取所有修改的行response write它们作为
  • 如何在VBS中使用Excel内置常量[重复]

    这个问题在这里已经有答案了 我想使用VBScript而不是VBA来处理EXCEL 但是我在调 用Range Find方法时遇到了代码错误 见下文 Function find range wb domain var Dim sheet Dim
  • 列表分隔符脚本

    如何从命令行更改列表分隔符 通常我必须编辑以下字段 控制面板 更改键盘或其他输入法 其他设置 我想创建一个 VBScript 单击它会自动更改 to 还有另一个可以返回的 一个脚本就足够了 该设置存储在注册表值中HKCU ControlPa
  • 如何在 VBScript 中计算每月的最后一个工作日

    如何在 VBScript 中计算该月的最后一个工作日 它用于 Reporting Services 报告 Thanks 怎么样 intMonth 11 Use zero to return last day of previous mont
  • 使用ASP/VB获取节点属性值

    我有以下 XML 架构
  • 比较数组中的文件、从文本文件中删除行、函数、日志记录

    所以我创建了这两个数组 Approved Shares 和 Current Shares Reads Approvedshare txt and makes the txt file into an array public objFSO
  • 使用 VBScript 在日期字段值上选择错误的数据

    我有一张包含以下数据的表 现在 Excel 共有 36 个任务 每个任务有 4 列 第一个任务 即 Task1 名称将始终从 L 列开始 144 列描述了 36 个任务 现在我们需要按行进行检查 并需要检查 TNStart 开始日期 你们能
  • InnerHTML 什么时候立即执行?

    我希望打印这个 HTA 代码a一段时间后被替换为b 然而 它的作用是在一段时间内不打印任何内容 然后b 启用 MsgBox 行后 它会打印a第一的 看来执行的是statusinfo InnerHTML a 被推迟了 有谁能告诉我这是为什么吗
  • 生成Excel文件错误

    我在经典 ASP 中使用以下代码生成 Excel 文件 代码很简单并且有效 我在 Windows Vista x86 上的 IIS 7 0 下运行代码 两个问题 有一个奇怪的警告框 这是屏幕快照 http i27 tinypic com 2
  • 在 ASP.Net 网站中使用 VBScript 中的变量

    我花了一天的大部分时间来研究这个问题 但找不到答案 我对 stackoverflow 比较陌生 询问多个问题是否有一定的礼仪 过去几天我问了三个问题 Anyways 这是代码隐藏文件中的代码 它执行脚本 systeminfo vbs 并且工

随机推荐

  • IllegalArgumentException Base64到图像解码android

    我想将 Base64 格式的 Web 服务中的图像解码为位图 并在我的 Android 应用程序中使用它 这是我的方法 public Bitmap getCaptcha throws IOException List
  • (ngModelChange) 不会更新特定输入的 UI

    我有一个输入字段 用户可以在其中输入某物的比率 当用户输入一个值时 我希望在四舍五入后显示该值 然后将更新后的值存储在支持模型中ts file 使用 Angular 管道对此效果不佳 因为单向管道和更新的值不会反映在模型上 因此 为了使其双
  • 如何使用 image_picker 依赖项将图像上传到 flutter 中的 sqlite 数据库

    Future getImage ImageSource imageSource async var image await ImagePicker pickImage source imageSource setState image im
  • STL 中 next_permutation 的 Python 实现

    next permutation 是一个 C 函数 它给出字符串按字典顺序排列的下一个排列 有关其实现的详细信息可以从这篇非常棒的文章中获得 http wordaligned org articles next permutation ht
  • CXF ClientProxy getClient“不是代理实例”

    我正在尝试将 WS security 与我的 Apache CXF 客户端结合使用 我需要掌握客户端端点 以便添加 WSS4J 拦截器 然而 当我打电话时ClientProxy getClient 我得到一个IllegalArgumentE
  • 无法使用 Visual Studio 2013 社区运行 Xunit

    我正在尝试让 XUnit 与 Visual Studio 2013 Community 版本 12 0 31101 00 Update 4 一起使用 我已经让 NUnit 工作了 所以我认为让 XUnit 工作起来会很简单 代码是 usin
  • java.net.ConnectException:无法连接到/127.0.0.1:9080领域对象服务器

    我在看到网站中的文档后刚刚安装了领域对象服务器 我创建了一个登录页面 android 并根据网站使用了同步用户设置 但我在创建时的 asynctask 显示了上述错误 这是我的代码 public class RealAsyncTask ex
  • 动态创建类属性

    我正在寻找一种方法来动态创建具有可通过典型实例表示法访问的特定属性的类 DynoOne createClass DynoOne props A B d DynoOne database XYZ d A d B 1 DynoTwo creat
  • 有没有办法获得总设备内存?我需要它来优化

    我有一个可以包含静态数据的 lrucache 这样即使我的应用程序在用户返回时关闭 他也可以更快地找到数据 然而 这需要大约 10 15 MB 的内存 所以我想创建一个像这样的 if 分支 if deviceOverallRAM gt tr
  • 从一个活动调用另一个活动中的方法

    我知道我们无法从另一个活动中的活动调用方法 我正在尝试找出解决这个问题的最佳方法 这是我的代码 这是我试图调用的方法 它在我的ScoreCard活动 public void numPlayerSetup int ids R id TextV
  • 更改文件创建日期不起作用

    我使用以下命令来更改文本文件的创建日期 using System IO DateTime newCreate new DateTime year month day hour minutes seconds File SetCreation
  • 在 JavaScript 中确定域名?

    使用有什么区别 if document domain toLowerCase indexOf domainName 1 and if window location href match 1 toLowerCase indexOf doma
  • 是否可以使用 content:// 作为 WebView 中

    我创建了一个ContentProvider 它导出我的 asset 目录中的文件 我使用 content url 来访问 WebView 中导出的内容 以下 HTML 按预期工作 img src 我正在尝试使用 mp3 音频文件的内容提供程
  • php 将变量绑定到旧 PHP 中的函数作用域

    我想将变量绑定到函数的作用域 我可以在 PHP 5 3 之后使用 use 关键字在 php 中执行此操作 但是如何在 PHP 5 3 以下的版本中执行等效操作 test use keyword function test use keywo
  • RDBMS 对 Golang 的影响 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我不会对这个关于我测试过的内容和数字运算的问题进行长篇大论 我对最新的实际练习表演更感兴趣 我已经阅读了大量的文章 其中一些非常怀疑 或者非常怀
  • Visual Studio 默认自动完成使用系统类型名称

    奇怪的问题 但我的老板有点老派 坚持在我们的编码标准中我们不使用 C 简写系统类型 他喜欢我们使用完整的系统名称 他喜欢事情变得冗长 我很乐意遵守这个标准 然而 几个月后开始让我恼火的是 Visual Studio 在完成代码时不喜欢遵守标
  • Android 如何从相机捕获两个连续的帧

    我正在尝试在 Android 设备上对光流进行编程 我的问题是从相机获取两个连续的帧 这是获取一帧的代码 mCamera setPreviewCallback new PreviewCallback public void onPrevie
  • Java 装饰器模式:我可以装饰受保护的方法吗?

    我想要Decorate 装饰器设计模式 一个通用的基类 但是我需要的方法Decorate受到保护 参见示例 public class AbstractActor public void act Delegates its actions t
  • 强制隐式调用的依赖类型解析

    我有一个包装特征 trait Wrapper T type Own F lt OwnThing F def ask F implicit own Own F 还有不同的实现 这里是一个例子 class CombinedWrapper A B
  • 暗淡和公共有什么区别?

    今天提出了一个关于范围的问题 这引起了我的思考 我一直了解 VBScript 范围以及如何声明全局和本地 我突然想到我从来没有使用过Public变量但倾向于使用Dim相反 在全局声明时 据我了解Dim是相同的Public 但如果是这样的话