暗淡和公共有什么区别?

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(使用前将#替换为@)

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

  • 经典 ASP 中的超时问题

    我正在开发一个经典的 ASP 项目 在从数据库填充数据并将其绑定到 UI 中时遇到超时问题 我们得到以下错误 脚本超时 超出了脚本执行的最长时间 您可以通过为 Server Scripttimeout 属性指定新值或更改 IIS 作为管理工
  • VBScript 宏 getParentFolder 名称

    我正在尝试创建一个 vbscript 宏 它将获取存储宏的文件夹位置并将输出文件创建到同一文件夹中 我正在使用下面的代码 但它没有获得正确的位置 Set obj1FSO CreateObject Scripting FileSystemOb
  • ASP/VBScript - Int() 与 CInt()

    ASP VBScript 之间有什么区别Int and CInt Int http www w3schools com Vbscript func int asp Int 函数返回指定数字的整数部分 CInt http www w3scho
  • ADO 参数化查询不返回任何结果

    我正在使用此查询从经典 asp 页面中的 vbscript 获取一些结果 但它不会返回任何值 该页面是空白的 也没有错误 请问有什么建议吗 dim cmd admin no admin no request QueryString admi
  • MySQL / 经典 ASP - 参数化查询

    在绝对紧急的情况下 我正在尝试浏览我的网站并添加参数化查询 我是新手 刚刚了解它们 我的问题是 我对连接类型知之甚少 并且我看到的所有示例都使用另一种连接方法 这让我感到困惑 我并不是特别想改变连接到数据库的方式 因为它位于很多页面上 我只
  • 在 VBS 中使用环境变量的值时出现问题

    我是 VBScript 新手 编写了一个可以修改 XML 文件的小脚本 但我在将计算机名称放入 XML 时遇到问题 我从以下位置获取了计算机名称HOST使用这些行的环境变量 Set wshShell CreateObject WScript
  • 暗淡和公共有什么区别?

    今天提出了一个关于范围的问题 这引起了我的思考 我一直了解 VBScript 范围以及如何声明全局和本地 我突然想到我从来没有使用过Public变量但倾向于使用Dim相反 在全局声明时 据我了解Dim是相同的Public 但如果是这样的话
  • SagePay 表单 - 经典 ASP - 使用 rijndael.asp 时缺少货币字段

    我正在尝试在经典 ASP 中添加 Form Intergration SagePay 支付网关 我有一个来自 SO 的可用 PHP 版本 我已将其翻译成 VBSCRIPT 一切似乎都工作正常 但加密除外 我使用与 PHP 脚本相同的输入 以
  • 并排启动两个资源管理器窗口

    有没有办法使用批处理脚本并排 垂直平铺 启动两个资源管理器窗口 如果没有 我该如何使用 VBS 来做到这一点 我已经修改了上面的VBS脚本Hackoo完全按照OP的要求去做 脚本中的注释准确地解释了它将做什么 如果两个窗口未设置到正确位置
  • 使用VBS脚本检查字符串是否包含特定字符

    我的脚本正在做以下几点 检索所有我选择的文件夹文件 按日期对它们进行分类 从最近的到较早的 在窗口中显示它们 这是我的 VBS 脚本 我检索它here http codes sources commentcamarche net sourc
  • 如果 vbs 脚本崩溃,请重新启动它

    我正在尝试制作一个 vb 脚本 如果它崩溃 它将重新启动另一个 vb 脚本 我搜索了又搜索 但我得到的只是如何重新启动程序 并且由于 vb 脚本是后台进程 因此当您在 Win32 Process 中搜索时它不起作用 这是我的代码 set S
  • assessionid 名称更改

    如果我有一种简单的改变方法 我的生
  • 经典的 asp/vbscript - 使用正则表达式修改所有 href

    在经典 ASP VB 脚本 中 我需要通过对当前 url 进行编码并在其前面挂起来修改字符串中包含的多个不同的 href 基本上 我想让所有的 href 都通过我的redirect asp 并将现有的 href 编码传递到新链接中 例如 现
  • 使用 javascript 获取选择标签的名称

    我在任何地方都没有找到这个问题 所以我将其发布在这里 我有一堆选择标签 部分使用 VBScript 命名 我希望能够获取从 javascript 中的 onchange 事件调用的选择标签的名称 这是代码
  • 如何在经典 ASP 中将 Windows-1255 转换为 UTF-8?

    如何将 windows 1255 字符串转换为 utf 8classic应用服务提供商 我的数据库是 windows 1255 我想将我的网站转移到 utf 8 代码是否在这个答案 https stackoverflow com quest
  • 当地语言的布尔值

    这个问题很久以前就被问过服务器故障 https serverfault com questions 274964 iis 7 5 using classic asp converts a boolean value to a string
  • 有关于 VBScript 正则表达式对象 (RegExp) 的好文档吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们都知道每个正则表达式实现都有其自身的特点 我需要在使用 COM 自动化的应用程序中使用 Micros
  • Response.Buffer / Flush 似乎不起作用

    我有一个经典的 asp 页面 用户使用 Response Buffer True 和 Flush 在我的本地电脑上 这个页面运行得非常好 我已将该页面上传到我的网络服务器 但它不起作用 我唯一能够检查的是两台机器上 IIS 下的 ASP B
  • VBscript 以提升的权限运行 bat 文件

    这是我的bat文件 REG DELETE HKLM Software Microsoft Windows CurrentVersion WindowsUpdate v SusClientId f REG DELETE HKLM Softwa
  • 使用 VBScript 重命名 IIS 中的虚拟目录?

    如何使用 VBScript 重命名 IIS 6 0 7 0 中的虚拟目录 或 Web 应用程序 如果您只想更改 IIS 7 中的站点名称 编辑applicationHost config文件 该文件可以在以下位置找到c Windows Sy

随机推荐

  • 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 但如果是这样的话