twinBASIC新增功能
twinBASIC通过新的数据类型、语言构造、运算符、运行时函数和项目级功能扩展了VBA语言。本页列出了有独立参考页的新增功能,按类别分组。
面向从VBA或VB6转来的开发者的更广泛概述,参见欢迎页。
新数据类型
| 类型 | 描述 | 备注 |
|---|---|---|
| LongLong | 8字节有符号整数 | 在32位和64位构建中都可用;VBA限制为64位 |
| LongPtr | 指针宽度有符号整数 | 32位为4字节,64位为8字节;用于Declare语句 |
| Decimal | 128位定点小数类型 | 可作为独立声明类型使用,不仅是Variant子类型 |
参见数据类型获取完整类型表,功能 → 新数据类型了解这三种类型的更多详情。
新语言构造
面向对象
- Interface -- 使用twinBASIC语法定义COM接口;实现它的类必须提供所有成员
- CoClass -- 声明COM co-class;在编译时生成COM注册元数据
- Inherits -- 使一个类继承另一个类的实现(仅支持单继承)
- Implements Via --
Implements的扩展形式,将接口调度委托给成员对象,而非需要逐成员转发代码 - Protected -- 声明类及其派生类可访问的类成员;VBA无等效功能
泛型
twinBASIC使用Of关键字支持泛型类型和泛型模块。泛型类或模块在实例化时接受一个或多个类型参数 --- 例如WinEventLogLib包中的EventLog(Of EventIds, Categories),或WinServicesLib中的ServiceCreator(Of T)。
新声明关键字
- Delegate -- 声明有类型函数指针类型;启用类型安全的
AddressOf和CDecl回调 - Enum成员范围 -- 枚举成员现在可以通过名称引用其他成员,而不仅是字面整数
控制流
- Continue -- 跳到封闭循环的下一次迭代(
Continue For、Continue Do、Continue While);VBA无等效功能 - Return -- 在一条语句中退出Function或Property Get并提供返回值;同时保留旧版GoSub/Return含义
属性
twinBASIC在声明和模块上使用方括号属性语法:
[Documentation("Returns the absolute value of n.")]
[COMCreatable(False)]
Public Function Abs(ByVal n As Double) As Double完整列表参见属性,包括[DllExport]、[DebugOnly]、[WindowsControl]、[MustBeQualified]、[PreserveSig]等。
内联初始化
变量可以在声明时初始化:
Dim total As Long = 0
Dim greeting As String = "Hello"
Dim items() As String = Array("a", "b", "c")参见功能 → 内联初始化。
参数化New
当类暴露具有匹配参数的_Initialize方法时,New接受构造函数参数:
Dim conn As New NamedPipeClientConnection("\\.\pipe\mypipe", token)参见功能 → New。
新运算符
| 运算符 | 描述 |
|---|---|
| AndAlso | 短路逻辑AND --- 左操作数为False时不求值右操作数 |
| OrElse | 短路逻辑OR --- 左操作数为True时不求值右操作数 |
| IsNot | Is的逻辑反;a IsNot b等同于Not (a Is b) |
| LeftShift | 按位左移;x LeftShift n将x左移n位 |
| RightShift | 按位右移;x RightShift n将x右移n位 |
新运行时函数
这些函数存在于VBA包中,但标准VBA中没有等效功能 --- 它们是twinBASIC新增的:
| 函数 | 模块 | 描述 |
|---|---|---|
| CType | Conversion | 显式转换为调用方提供的类型;语法CType(expr, TypeName) |
| If | Interaction | 三元 --- 求值为两个值之一;仅求值所选分支 |
| CallByDispId | Interaction | 通过IDispatch调度ID调用方法或属性 |
| RaiseEventByName | Interaction | 按名称引发事件,以Variant数组传递参数 |
| RaiseEventByName2 | Interaction | 按名称引发事件,使用可变长度参数列表 |
| ObjPtr | Information | 返回对象的COM标识地址 |
| VarPtr | Information | 返回变量的地址 |
| StrPtr | Information | 返回String底层字符缓冲区的地址 |
| IsArrayInitialized | Information | 返回动态数组是否已分配维度 |
| TranslateColor | Information | 将OLE颜色转换为纯RGB值 |
额外的低级内存、线程和内省函数记录在HiddenModule节中。
项目和运行时功能
64位编译
twinBASIC可以编译为32位或64位本机代码。目标按项目设置。参见功能 → 64位编译并使用#If Win64 Then / #If Win32 Then条件编译架构特定代码。
静态链接(Fusion)
twinBASIC可以将其运行时静态链接到输出EXE中,生成无需单独运行时DLL的单文件可分发程序。参见功能 → Fusion。
多线程
twinBASIC通过Thread API支持后台线程。参见功能 → 多线程。
内联汇编
Emit / EmitAny函数向封闭过程生成的代码中注入原始字节序列。[Naked]属性抑制生成的序言和结语。参见功能 → 汇编。
增强的API声明
除了标准Declare,twinBASIC新增了:
DeclareWide--- 禁用字符串参数的ANSI/Unicode转换CDecl调用约定,在声明和常规函数上ByValUDT传递- 可变参数(
CDecl+ParamArray ... As Any())参数列表
参见功能 → 增强API声明。
IDE新增功能
- CodeLens --- 过程上方的内联操作栏("运行"、"调试"、"测试"),无需离开编辑器。参见功能 → CodeLens。
- 包服务器 (TWINSERV) --- 无需离开IDE即可从中央注册表安装包。参见功能 → 导入包。
- 类型推断 ---
Dim x = 1推断为Long;For Each item In collection在集合有类型时推断元素类型。参见功能 → 类型推断。 - 条件编译常量(
#Const、#If)--- VBA集合的超集;参见编译器常量。