作为模块化字段访问修饰符的 Dim、Global、Public 和 Private 有啥区别?

Posted

技术标签:

【中文标题】作为模块化字段访问修饰符的 Dim、Global、Public 和 Private 有啥区别?【英文标题】:What is the difference between Dim, Global, Public, and Private as Modular Field Access Modifiers?作为模块化字段访问修饰符的 Dim、Global、Public 和 Private 有什么区别? 【发布时间】:2011-04-18 10:48:18 【问题描述】:

在 VB6/VBA 中,您可以在特定的 SubFunction 方法之外声明模块级变量。我在内部模块之前使用过PrivatePublic,并像这样理解它们:

Public - 对模块内的所有代码和模块外的所有代码可见,本质上使其成为全局的。 Private - 仅对模块内的代码可见。

我注意到您可以使用DimGlobal 作为模块化变量的修饰符。 DimGlobal 分别与 PrivatePublic 在模块化字段上用作访问修饰符时不同吗?如果有,它们有何不同?

【问题讨论】:

【参考方案1】:

DimPrivate 的工作方式相同,但常见的约定是在模块级别使用Private,在子/函数级别使用DimPublicGlobal 在功能上几乎相同,但是 Global 只能用于标准模块,而 Public 可以用于所有上下文(模块、类、控件、表单等)Global来自旧版本的 VB,可能为了向后兼容而保留,但已被 Public 完全取代。

【讨论】:

感谢您的回答。你的解释和我一直在想的差不多。我从一大块遗留代码开始,这些代码在单个模块的声明部分中使用了所有四个修饰符。 全局变量在执行后保持其值。 将您的 cmets 与 Excel 2010 的在线帮助进行比较揭示了几个非常好的点:“使用 Public 语句声明的变量可用于所有应用程序的所有模块中的所有过程,除非选项私有模块位于效果;在这种情况下,变量仅在它们所在的项目内是公共的。此外,请注意:类模块中不能使用 Public 语句来声明固定长度的字符串变量。因为以上两者都是晦涩的用例,两者都不太可能成为实际问题。不过,为了完整性。 虽然问题只涉及模块级声明,但为了完整起见(对于新手而言),值得明确指出的是,PrivatePublic 甚至不允许在过程中使用。 Private 声明的 official documentation 在这方面似乎有一个错字(它几乎与 Dim 声明的文档复制并可能(?)相同):“当您在 [sic !] 一个过程..." 是否有弃用 global 以支持 public 的文档?

以上是关于作为模块化字段访问修饰符的 Dim、Global、Public 和 Private 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

没有访问修饰符的字段,java [重复]

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

Kotlin 中内部可见性修饰符的范围

170905-关于修饰符的问题

const 和 readonly 修饰符的用法

使用 ASM 树 API 获取字段的修饰符