该类型用于类型化数组。它已在 X# 运行时中引入。内部类型名是 XSharp.__ArrayBase 。
下面的代码展示了如何使用它。
许多接受数组的现有 XBase 运行时函数现在也接受 ARRAY OF。
期望使用数组代码块的运行时函数期望使用 ARRAY OF 的 Lambda 表达式。
不同之处在于 Lambda 表达式的参数将是类型化的,因此无需后期绑定。
代码块的参数始终是 usual 类型,因此要么需要后期绑定支持,要么需要在代码块内将其转换为正确的类型。
我们还引入了一种特殊的多维语法。在下面的示例中,您还可以使用以下语法获取数组中第一个开发人员的名字:
cFirst := aDevelopers[1, "FirstName"]
当你使用现有的生成代码,而现有代码使用 DEFINE 来定义多维数组中的元素时,这可能会很有用。
如果你有一个(生成的)定义,如
DEFINE DEVELOPER_FirstName := 1
然后,您可以更改代码生成器,生成以下代码
DEFINE DEVELOPER_FirstName := "FirstName"
使用 DEFINE 的代码可以保持不变
cFirst := aDevelopers[1, DEVELOPER_FirstName]
FUNCTION Start AS VOID
// 声明 Developer 对象为 Array Of 数组
LOCAL aDevelopers AS ARRAY OF Developer
// 使用 "普通 "数组语法初始化数组
aDevelopers := {}
// AAdd 也支持 Array 类型
AAdd(aDevelopers, Developer { "Chris","Pyrgas"})
AAdd(aDevelopers, Developer { "Nikos", "Kokkalis"})
AAdd(aDevelopers, Developer { "Fabrice", "Foray"})
AAdd(aDevelopers, Developer { "Robert", "van der Hulst"})
// AEval 知道每个元素都是一个 Developer
AEval(aDevelopers, { d => Console.WriteLine(d)})
// ASort 知道类型并将正确的类型传递给 lambda 表达式。
// 编译器和运行时 "知道 "x 和 y 是 Developer 对象,并将生成早期绑定代码
ASort( aDevelopers, 1, ALen(aDevelopers), { x, y => x:LastName < y:LastName})
// Foreach 知道每个元素都是一个 Developer 对象
FOREACH VAR oDeveloper IN aDevelopers
? oDeveloper:LastName, oDeveloper:FirstName
NEXT
RETURN
CLASS Developer
PROPERTY FirstName AS STRING AUTO
PROPERTY LastName AS STRING AUTO
CONSTRUCTOR()
RETURN
CONSTRUCTOR (cFirst AS STRING, cLast AS STRING)
FirstName := cFirst
LastName := cLast
METHOD ToString() AS STRING
RETURN Firstname+" " + LastName
END CLASS