向编译器声明一个结构名。
[Attributes] [Modifiers] STRUCTURE <idStructure>
[IMPLEMENTS <idInterface>[, <IdInterface2>,..]
[StructureMembers]
END STRUCTURE
Attributes | 一个可选的特性列表,用于描述实体的元信息,例如在 MsTest 类库中包含测试的方法/函数上的 [TestMethod] 属性。请注意,当特性写在关键字上方的行时,特性必须在同一行或以分号结尾。 |
Modifiers | 一个可选的修饰符列表,用于指定实体的可见性或范围,例如:PUBLIC, PROTECTED, HIDDEN, INTERNAL, SEALED, ABSTRACT 或 STATIC. |
<idStructure> | 结构的有效标识符名称。 结构是一个实体,因此与其他实体共享相同的名称空间。 这就意味着不可能出现结构和全局变量同名的情况。 |
IMPLEMENTS <idInterface> | 该结构实现的接口名称 |
StructrureMembers | 可以是以下任何一种: ACCESS, ASSIGN, CONSTRUCTOR, DESTRUCTOR, EVENT, METHOD, OPERATOR, PROPERTY, 就像在 CLASS 声明中一样 |
在本例中,变量 x 和 z 被输入为 INT,而变量 cName 和 cAddr 被输入为 STRING。
在向编译器声明结构名之后,紧跟其后的是 0 个或多个实例变量声明语句。 使用结构名声明变量(参见本指南中的 GLOBAL 和 LOCAL 语句)的目的是保存特定类的实例、实例化类的实例、定义方法(参见本指南中的 METHOD 语句)和类的子类。
实例变量的绑定:实例变量可以是早期绑定或晚期绑定,这取决于您如何声明它们以及如何使用它们。
如果在编译时知道变量的内存位置,则会发生早期绑定。编译器确切地知道如何引用变量,因此可以生成相应的代码。
如果在编译时不知道变量的内存位置,则需要进行晚期绑定。编译器无法从程序源代码中确定变量的确切位置或如何引用它,因此会生成代码在表中查找符号。查找是在运行时执行的。
由于早期绑定的实例变量不需要运行时查找,因此与晚期绑定变量相比,使用它们将显着提高应用程序的性能。以下表总结了四种类型的实例变量的绑定和可见性问题。
变量类型 | 绑定 可见性 |
EXPORT | 如果可能,尽早绑定 全应用程序 CLASS 和全模块 STATIC CLASS |
INSTANCE | 永远是后期绑定 在类和子类中 |
HIDDEN | 永远是前期绑定 仅在类中 |
PROTECT | 永远是前期绑定 在类和子类中 |
对象实例化: 声明类后,使用类名和实例操作符 {} 创建类的实例。 语法如下
<idClass>{[<uArgList>]}
其中 <uArgList> 是以逗号分隔的可选值列表,这些值作为参数传递给一个名为 Init() 的特殊方法(有关 Init() 方法的更多信息,请参阅本指南中的 METHOD 语句)。
访问实例变量: 从外部访问导出的实例变量(即从任何不是其类方法的实体)的语法如下:
<idObject>:<idVar>
只有在可以看到非导出实例变量的方法中,才能访问这些变量。 在一个方法中,可以使用以下语法访问所有实例变量:
[SELF:]<idVar>
SELF: 前缀是可选的,除非是 ACCESS/ASSIGN 方法(更多信息请参阅本指南中的 ACCESS 和 ASSIGN 语句,以及 METHOD 语句中有关 SELF 的更多信息)。
实例变量与其他程序变量一样。 您可以在语言中允许使用表达式的任何地方访问它们。
XSharp 不再支持 [STATIC] 前缀
下面的示例定义了两个类,其中一个继承了另一个的值,并演示了如何创建一个带有实例变量初始值的类实例:
ACCESS, ASSIGN, CONSTRUCTOR, DESTRUCTOR, EVENT, METHOD, OPERATOR, PROPERTY