X# 编译器可以识别 X# 的不同方言。下表显示了这些方言之间的区别。
您可以使用 /dialect 编译器选项来选择要使用的方言。
默认使用 Core 方言。除 Core 方言外,其他方言都需要引用 XSharp 运行时动态链接库
功能 |
Xbase++ 14 |
|||||
---|---|---|---|---|---|---|
关键词的4 个字母的缩写(FUNC、WHIL 等). |
- |
Yes 11 |
- |
Yes 11 |
遵循 Xbase++ 的约定 |
Yes 11 |
&& 作为单行注释的用法(// 的替代语法) |
- |
Yes |
- |
Yes |
Yes |
Yes |
* 作为首字符用于注释的用法 |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
ALIAS (->) 操作符 |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
使用 AND, NOT, OR, XOR 替代 .AND., .NOT. 等 |
- |
- |
- |
- |
- |
Yes |
ARRAY 类型,包括 Array 字面量和 NULL_ARRAY,包括缺失元素(的 Array) |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
BREAK 语句 |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
BEGIN SEQUENCE .. RECOVER .. END SEQUENCE |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
CLIPPER 调用约定(需要 USUAL 支持) |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
CODEBLOCK 类型 |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
DATE 类型,包括 NULL_DATE |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
DATE 和 DateTime 字面量 |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
包含可选类型子句的 DEFINE 语句 |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
FIELD 语句,并识别为字段名而不是局部变量或者变量实例 |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
FLOAT 类型,包括 Float 字面量和 /vo14 编译器选项 |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
FOR .. ENDFOR 替代 FOR .. NEXT |
- |
- |
- |
- |
Yes |
Yes |
FOR EACH 替代 FOREACH |
- |
- |
- |
- |
- |
Yes |
GLOBAL 语句 |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
IIF() 表达式和 /vo10 编译器选项 |
Yes 7 |
Yes 7 |
Yes 7 |
Yes |
Yes |
Yes |
后期绑定 |
- |
Yes (with /lb+) |
Yes (with /lb+) |
Yes |
Yes |
Yes |
LPARAMETERS 语句 |
- |
- |
- |
- |
- |
Yes |
MACRO 编译器 |
- 13 |
Yes |
Yes |
Yes |
Yes |
Yes |
MEMVAR, PUBLIC, PRIVATE, PARAMETERS 语句,包括未声明变量 14 |
- |
Yes |
- |
Yes |
Yes |
Yes |
PSZ 类型,包括 NULL_PSZ 和(伪) PSZ 转换函数 (String2Psz(), Cast2Psz() |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
PSZ 索引 |
n/a |
1 based |
0 based |
1 based |
1 based |
1 based |
NULL_STRING |
Yes 9 |
Yes 9 |
Yes |
Yes |
Yes |
Yes |
SYMBOL 类型,包括 Symbol 字面量和 NULL_SYMBOL |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
源文件中第一个实体之前的 Statements |
- |
- |
- |
- |
- |
Yes |
USUAL 类型,包括 NIL 字面量 (1,2) |
- |
Yes |
Yes |
Yes |
Yes |
Yes 15 |
TEXT 命令 |
- |
- |
- |
- |
- |
Yes |
特殊功能 |
Yes |
Yes |
Yes |
|||
VOSTRUCT 和 AS / IS 语法 (10) |
- |
Yes |
Yes |
- |
- |
- |
UNION 和 AS / IS 语法 (10) |
- |
Yes |
Yes |
- |
- |
- |
未定义类型的字面量数组(Untyped Literal Arrays) |
- |
Yes 8 |
Yes 8 |
Yes |
Yes |
Yes |
允许不定义类型(Missing types allowed) |
- |
Yes 3 |
Yes 3 |
Yes |
Yes |
Yes |
函数/方法调用中允许缺少参数 MyFunc(1,,2) |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
伪函数 |
Yes |
Yes |
Yes |
|||
PCount(), _GetMParam(), _GetFParam(), _Args() |
- |
Yes 4 |
Yes 4 |
Yes 4 |
Yes 4 |
Yes 4 |
SLen() |
- |
Yes 5 |
Yes 5 |
Yes 5 |
Yes 5 |
Yes 5 |
_Chr() |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
AltD() |
- |
Yes 6 |
Yes 6 |
Yes 6 |
Yes 6 |
Yes 6 |
PCall, PCallNative |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
CCall, CCallNative |
- |
Yes |
Yes |
Yes |
Yes |
Yes |
其他信息 |
||||||
Generated Function class name |
Functions |
<AssemblyName>.Functions (DLLs) |
1.需要 VulcanRT.DLL 或 XSharp.VO.DLL
2.需要 VulcanRTFuncs.DLL 或 XSharp.VO.DLL
3.缺少定义的类型会被翻译为 USUAL。使用新的 /vo15 编译器选项,您可以告诉编译器不允许缺少类型定义。
4.仅支持在函数和方法中使用 Clipper 调用约定
5.Vulcan 运行时没有 SLen() 函数。编译器会将其转换为访问字符串的 Length 属性。
6.这将被转换为:
IF System.Diagnostics.Debugger.Attached
System.Diagnostics.Debugger.Break()
ENDIF
7.在 Core 方言中,每个表达式都被转换为 OBJECT。在其他方言中,表达式被转换为 USUAL。
8.在 VO/Vulcan 方言中,非类型化字面量数组被转换为 VO 数组类型:
{"aa", "bb", "cc"}
类型字面量数组的前缀是 <Type>,如下所示:
<STRING>{"aa", "bb", "cc"}
这就变成了字面量字符串数组
9. /vo2 编译器选项会将 NULL_STRING 编译为空字符串。否则编译为 NULL。
10.VOSTRUCT 和 UNION 可以用标准的 .NET 结构代替。对于 Union,您需要在结构体上使用 [StructLayout(LayoutKind.Explicit)] 特性(attribute),并在每个字段上使用 [FieldOffSet()] 特性(attribute)来明确定义字段的位置。
11.仅适用于与 VO 兼容的关键字,不适用于 Vulcan 或 XSharp 中引入的关键字。
12.在 Harbour 和 Xbase++ 中,IIF() 的 true 和 false 表达式是可选的。
13.不支持宏编译器。然而,当你在 Core 方言中使用 RDD 系统时,索引表达式仍将使用宏编译器,并且需要引用 XSharp.RT.DLL 以支持宏编译器。
14.这需要 XSharp 运行时。
.
15.在 FoxPro 中不允许使用 NIL,并将其重新定义为 FALSE。