访问修饰符限制程序元素的可见性:
•PUBLIC/EXPORT:公共函数、全局、类型(类、结构、委托等)或类型成员(字段、方法、属性、事件等)对声明它的同一程序集(exe 或 dll)中的所有代码以及声明程序集引用的程序集都是可见的。这是 X# 的默认设置。
•PROTECT/PROTECTED:PROTECT(ED)关键字只能应用于类型成员,并限制其在同一类型和继承自该类型的类的代码中的可见性。
•INSTANCE: X#(和 Visual Objects)独有的修饰符关键字,与 PROTECT 非常相似,但只适用于类字段,其语义与 PROTECT 不同,取决于同一类中的代码使用它的方式(请参阅下面的示例)。
•PRIVATE/HIDDEN:也适用于类型成员,但比 PROTECT 更严格,因为它限制了成员的可见性,只对声明该成员的类型内的代码可见(而不是对继承自该类型的类可见)。如果将一个字段或方法声明为 PRIVATE,当编译器检测到该字段或方法从未在类内被调用时,可能会产生编译器警告 xs0169。
•INTERNAL:限制类型或成员的可见性,只对同一程序集(dll 或 exe)中的代码可见。内部成员对定义程序集之外的任何代码都不可见,甚至对其他程序集中声明的该类的继承类也不可见。可与 PROTECTED 结合使用,这样,INTERNAL PROTECTED 成员只能在同一类中看到,也可以从定义在同一程序集中的继承类中看到,但不能从定义在其他程序集中的继承类中看到。
•XBase++ 方言也有修饰符 STATIC,这意味着类只能在使用它的源文件中可见。
注:通过使用 InternalsVisibleTo 属性,仍可明确指定某些程序集的内部类型和成员可见。更多信息,请参阅 System.Runtime.CompilerServices.InternalsVisibleToAttribute 文档。
INTERNAL PROCEDURE InternalProc() // 程序只能在同一程序集内访问
INTERNAL GLOBAL InternalGlobal AS INT // 只能在同一程序集内访问的全局
PUBLIC CLASS TestClass // 无处不在
EXPORT Export_field AS INT // 无处不在
PROTECT Protected_field AS INT // 本类及其继承的类可以访问
INTERNAL PROTECT Internal_Protected_field AS INT // 和继承自该类的类的访问权限,仅在同一程序集中定义
PRIVATE METHOD Private_Method() AS VOID // 只能从该类的代码中访问
END CLASS
作为从 Visual Objects 派生的代码的兼容性功能,INSTANCE 适用于字段,与 PROTECT 类似,但在定义了同名属性(或 ACCESS)时具有不同的语义。当使用 PROTECT 字段并在类型中定义了同名的 ACCESS/ASSIGN 对(或属性)时,该类中任何试图访问该成员的代码都将始终引用该字段。但当使用 INSTANCE 关键字声明该成员时,编译器会将该名称与 ACCESS 绑定:
FUNCTION Start() AS VOID
TestClass{}:DoTest()
CLASS TestClass
PROTECT Protected_member := "field" AS STRING
INSTANCE Instance_member := "field" AS STRING
ACCESS Protected_member AS STRING
RETURN "access"
ACCESS Instance_member AS STRING
RETURN "access"
METHOD DoTest() AS VOID
? SELF:Protected_member // field
? SELF:Instance_member // access, because the field is defined with the INSTANCE keyword
END CLASS
该功能是旧 Visual Objects 版本遗留下来的,旧版本会为窗口编辑器中的每个控件生成 INSTANCE 成员,在 X# 中已被淘汰,但出于兼容性原因仍可使用。