在VB.net中一维数组,与VBA有什么区别

==标题==

|------------------------|
| 在VB.net中一维数组,与VBA有什么区别 |

==正文==

(一)在VB.net中的一维数组,初始化与赋值,举例说明

以下是VB.net中一维数组的初始化与赋值方法及示例说明,结合不同场景提供具体代码:

一、声明时直接初始化

语法:`Dim数组名()As数据类型={值1,值2,...}`

特点:声明同时赋值,无需指定长度(编译器自动推断)

示例:

makefile 复制代码
' 初始化字符串数组 Dim fruits() As String = {"Apple", "Banana", "Orange"} ' 初始化整数数组 Dim numbers() As Integer = {1, 2, 3, 4, 5}

>此时`fruits`长度为3,`numbers`长度为5,索引从0开始。

二、先声明后赋值

场景:数组大小或初始值需动态确定

方法:分两步操作(声明+单独赋值)

'1.声明数组但不初始化

sql 复制代码
' 1. 声明数组但不初始化 Dim temperatures(3) As Single ' 声明长度为4的数组(索引0-3)' 2. 逐个元素赋值 temperatures(0) = 23.5 temperatures(1) = 18.2 temperatures(2) = 21.7 temperatures(3) = 25.0 
' 或使用索引变量批量赋值 Dim values(4) As Integer For i As Integer = 0 To 4     values(i) = i * 10 ' 结果:[0, 10, 20, 30, 40]Next

>注意:声明时`Dimarr(n)`表示索引范围0到n,总长度为n+1。

三、使用`New`关键字初始化

语法:`Dim数组名()As数据类型=New数据类型(){值1,值2,...}`

特点:显式调用构造函数,可结合匿名类型

示例:

makefile 复制代码
' 显式初始化 Dim colors() As String = New String() {"Red", "Green", "Blue"}' 初始化对象数组 Dim persons() As Object = New Object() {"Alice", 30, True}

>此方式与直接初始化等效,但语法更明确

四、动态调整数组大小(`ReDim`)

场景:需在运行时修改数组长度

方法:`ReDimPreserve数组名(新上界)`

示例:

powershell 复制代码
Dim scores() As Integer = {85, 90} ' 初始长度2 ' 扩展为长度5(原数据丢失)ReDim scores(4) ' 结果:[0, 0, 0, 0, 0]
' 保留原数据扩展 Dim data() As String = {"A", "B"}ReDim Preserve data(3) ' 结果:["A", "B", Nothing, Nothing]data(2) = "C" ' 赋值新元素

>关键:`Preserve`保留原有数据;无`Preserve`则重置所有元素为默认值

注意事项

1.索引范围:默认从0开始,可用`OptionBase1`改为从1开始(不推荐,易混淆)

2.类型安全:数组元素必须为同一数据类型(`Object`数组除外)

3.性能:频繁`ReDimPreserve`影响效率,建议改用`List(OfT)`动态集合

>完整示例可参考VB.net官方文档

(二)与VBA中的一维数组有什么区别

1. 1.索引默认起始值不同

  • VB.NET:
    数组索引严格从 0 开始(如 Dim arr(5) As Integer 包含索引 0~5 共6个元素)。Option Base 语句已被废弃,无法修改起始索引。
  • VBA:
    索引默认从 0 开始,但可通过 Option Base 1 改为从 1 开始。从 Excel 对象(如 Range)赋值的数组默认索引为 1 (如 arr = Range("A1:A10") 的索引为 1~10)。

🧩 2. 数据类型与灵活性差异

  • VB.NET:

    • 强类型数组(如 Integer()、String()),元素必须统一类型(Object 数组除外)。

    • 支持匿名类型数组(New With {.Name = "Alice"})。

  • VBA:

    • 常用 Variant 类型数组,可混合存储不同类型数据(如字符串、数字、对象)。

    • 从 Excel 获取的数组默认为二维结构(即使单列)。

⚙️ 3. 初始化与赋值语法

💡 VBA 的 Array() 函数返回索引从 0 开始的数组,而 Excel 赋值返回索引从 1 开始的数组

🔄 4. 动态数组调整(ReDim)

  • VB.NET:使用 ReDim Preserve arr(新上界) 保留数据,但频繁操作性能低,推荐改用 List(Of T)
  • VBA: ReDim Preserve 更常见,但同样有性能损耗;无内置集合类替代

🧠 5. 底层实现与功能扩展

  • VB.NET:

    • 数组继承自 System.Array,支持高级方法(如 Length、Copy)

    • 完全面向对象,可结合 LINQ 查询。

  • VBA:

    • 基于 COM,功能较基础,无内置迭代器或集合扩展方法。

    • 依赖 Excel 对象模型处理数据。


⚠️ 关键注意事项

  1. 索引陷阱:
    VBA 中从 Excel 获取的数组索引可能从 1 开始,而 Array() 生成的从 0 开始,易引发越界错误。
  2. 类型安全:
    VB.NET 的强类型减少运行时错误,VBA 的 Variant 数组更灵活但需手动校验类型。
  3. 性能场景:
    VB.NET 中大型数组操作优先选 List 或集合;VBA 中避免频繁 ReDim Preserve。

💎 总结建议

  • 迁移 VBA 到 VB.NET:
    注意索引重置为 0,用 List(Of T) 替代动态数组,强类型化数据。
  • VBA 优化:
    明确索引起点(用 LBound/UBound 检测),复杂数据处理时借用 Excel 函数

==The end==

==合集==

|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| VB.NET学习系列汇总 |

====若有用,请转发免费学习===

关注看更多文章

相关推荐
学长毕设8 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
C^h8 小时前
c++ string
开发语言·c++
raindayinrain8 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的9 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao9 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
zzu123zsw9 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
学逆向的10 小时前
C 局部静态变量
c语言·开发语言·网络安全
大都督会赢的10 小时前
C++第一节课
开发语言·c++
UIU11410 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”10 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc