Visual Basic 中的访问级别

已声明元素的访问级别是访问它的能力范围,即哪些代码有权读取或写入该元素。 这不仅取决于你声明元素本身的方式,还取决于元素的容器的访问级别。 不能访问包含元素的代码不能访问其包含的任何元素,甚至是声明为 Public 的那些元素。 例如,可以从包含 Private 结构的类中访问该结构中的 Public 变量,但不能从该类的外部访问。

公用

声明语句中的 Public 关键字指定可以从同一项目中任意位置的代码、从引用该项目的其他项目以及从通过该项目构建的任意程序集访问该元素。 下面的代码展示了示例 Public 声明:

Public Class ClassForEverybody

只能在模块、接口或命名空间级别使用 Public。 这意味着你可以在源文件或命名空间级别声明公共元素,也可以在接口、模块、类或结构中声明,但不能在过程中声明。

Protected

声明语句中的 Protected 关键字指定只能从同一类中或从派生自此类的类中访问该元素。 下面的代码展示了示例 Protected 声明:

Protected Class ClassForMyHeirs

只能在类级别使用 Protected,并且只能在声明类的成员时使用。 这意味着你可以在类中声明受保护的元素,但不能在源文件或命名空间级别,或在接口、模块、结构或过程中声明。

Friend

声明语句中的 Friend 关键字指定可以从同一程序集内访问该元素,但不能从程序集外部访问。 下面的代码展示了示例 Friend 声明:

Friend stringForThisProject As String

只能在模块、接口或命名空间级别使用 Friend。 这意味着你可以在源文件或命名空间级别声明友元元素,也可以在接口、模块、类或结构中声明,但不能在过程中声明。

Protected Friend

声明语句中的 Protected Friend 关键字组合指定可以从派生的类或从同一程序集内或通过两者皆可访问该元素。 下面的代码展示了示例 Protected Friend 声明:

Protected Friend stringForProjectAndHeirs As String

只能在类级别使用 Protected Friend,并且只能在声明类的成员时使用。 这意味着你可以在类中声明受保护的友元元素,但不能在源文件或命名空间级别,或在接口、模块、结构或过程中声明。

Private

声明语句中的 Private 关键字指定只能从同一模块、类或结构内访问该元素。 下面的代码展示了示例 Private 声明:

Private _numberForMeOnly As Integer

只能在模块级别使用 Private。 这意味着你可以在模块、类或结构内声明私有元素,但不能在源文件或命名空间级别、接口内或过程中声明。

在模块级别,没有任何访问级别关键字的 Dim 语句等效于 Private 声明。 但是,你可能需要使用 Private 关键字来使代码更易于阅读和解释。

Private Protected

声明语句中的 Private Protected 关键字组合指定只能从同一类中以及从与包含类相同的程序集中找到的派生类中访问该元素。 从 Visual Basic 15.5 开始支持 Private Protected 访问修饰符。

下面的示例显示了一个 Private Protected 声明:

Private Protected internalValue As Integer

只能在类的内部声明 Private Protected 元素。 不能在接口或结构中声明它,也不能在源文件或命名空间级别、接口或结构中或过程中声明。

Visual Basic 15.5 及更高版本支持 Private Protected 访问修饰符。 若要使用它,请将以下元素添加到 Visual Basic 项目 (*.vbproj) 文件中。 只要你的系统上安装了 Visual Basic 15.5 或更高版本,你就可以利用最新版本的 Visual Basic 编译器支持的所有语言功能:

<PropertyGroup>
   <LangVersion>latest</LangVersion>
</PropertyGroup>

若要使用 Private Protected 访问修饰符,必须将以下元素添加到 Visual Basic 项目 (*.vbproj) 文件中:

<PropertyGroup>
   <LangVersion>15.5</LangVersion>
</PropertyGroup>

有关详细信息,请参阅设置 Visual Basic 语言版本

访问修饰符

指定访问级别的关键字称为访问修饰符。 下表比较了访问修饰符:

访问修饰符 授予的访问级别 可使用此访问级别声明的元素 可在其中使用此修饰符的声明上下文
Public 不受限制:

可以查看公共元素的任何代码都可以访问它
接口

模块



结构

结构成员

过程

属性

成员变量

常量

枚举

事件

外部声明

委托
源文件

命名空间

接口

模块



结构
Protected 派生的:

声明受保护的元素的类中或派生自该类的类中的代码可以访问该元素
接口



结构

过程

属性

成员变量

常量

枚举

事件

外部声明

委托
Friend 程序集:

声明友元元素的程序集中的代码可以访问它
接口

模块



结构

结构成员

过程

属性

成员变量

常量

枚举

事件

外部声明

委托
源文件

命名空间

接口

模块



结构
Protected Friend ProtectedFriend 的联合:

与受保护的友元元素所在的同一类或同一程序集中的代码或者从该元素的类派生的任何类中的代码都可以访问它
接口



结构

过程

属性

成员变量

常量

枚举

事件

外部声明

委托
Private 声明上下文:

声明私有元素的类型中的代码(包括包含的类型中的代码)可以访问该元素
接口



结构

结构成员

过程

属性

成员变量

常量

枚举

事件

外部声明

委托
模块



结构
Private Protected 声明私有受保护的元素的类中的代码,或与 bas 类所在的同一程序集中找到的派生类中的代码。 接口



结构

过程

属性

成员变量

常量

枚举

事件

外部声明

委托

另请参阅