如何修改VB.NET字符串数组秩?VBA转VB.NET可变秩数组移植难题
移植VBA Variant数组到VB.NET的解决方案
核心思路:用Array替代VBA的Variant
VB.NET里没有Variant,但Array类型可以完美承接任意秩的数组,不管是1维还是2维都能存,刚好对应原VBA里Variant的角色。
1. 实现数组维度判断方法
原VBA的RankExists直接转成VB.NET的方法就行,用Array.Rank属性就能拿到数组的维度数:
Private Function RankExists(arr As Array, targetRank As Integer) As Boolean Return arr.Rank = targetRank End Function
2. 适配GetRecords的返回值
如果是自己实现GetRecords,直接让它返回Array类型;如果是调用原COM组件的GetRecords,VB.NET会自动把返回的Variant转成Array,不用额外处理。
3. 改造数组访问和函数调用
VB.NET里可以用GetValue方法统一访问不同维度的数组元素,不用区分括号里的参数个数;另外把MyFunctionX的参数改成Array类型,就能兼容两种数组:
完整移植代码示例:
Dim v As Array = GetRecords(strSQL) Dim bla As Object ' 也可以根据实际返回的数据类型声明,比如String、Integer等 If RankExists(v, 2) Then bla = v.GetValue(i, j) MyFunctionX(v) Else bla = v.GetValue(i) MyFunctionX(v) End If ' 对应的MyFunctionX示例 Private Sub MyFunctionX(arr As Array) ' 内部根据维度分支处理 Select Case arr.Rank Case 1 ' 1维数组逻辑 Case 2 ' 2维数组逻辑 End Select End Sub
可选优化:统一数组维度
要是不想后续代码里反复判断维度,可以把1维数组自动转成2维(1行N列),这样后续直接用2维的方式访问就行:
Dim v As Array = GetRecords(strSQL) ' 把1维数组转成2维(1行结构) If v.Rank = 1 Then Dim tempArr(0, v.Length - 1) As Object For idx As Integer = 0 To v.Length - 1 tempArr(0, idx) = v.GetValue(idx) Next v = tempArr End If ' 后续直接按2维数组处理,不用再判断 bla = v.GetValue(i, j) MyFunctionX(v)
这种方式既能保持原VBA代码的逻辑结构,又能符合VB.NET的类型规范,不用拆分声明不同维度的数组变量,算是比较优雅的移植方案。
内容的提问来源于stack exchange,提问作者SUSiS
相关产品推荐
相关产品推荐

