You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Sub Main()中调整二维数组大小?ReDim是否为最佳实践

在VB中调整模块级二维数组的大小(针对桌游场景)

好问题!先直接给你明确答案:你完全可以在Sub Main()里用ReDim调整模块级声明的二维数组大小,只要你一开始把数组声明为动态数组就行。关于“ReDim不是最佳实践”的说法,得结合你的具体场景来看——咱们一步步拆解。

1. 正确的模块级数组声明

首先,你在Sub Main()外部声明数组时,不能指定固定大小,必须声明为动态数组(也就是只写类型,不写上下界)。比如:

' 模块级声明(在所有Sub/Function之外)
Dim board() As Integer ' 这里用Integer举例,换成你需要的类型,比如String或自定义棋子类

如果写成Dim board(10,10) As Integer这种固定大小的数组,后续就不能用ReDim调整了,这是新手常踩的坑。

2. 在Sub Main()中用ReDim调整大小

当你获取到用户输入的X、Y尺寸后,直接用ReDim重新定义数组的上下界就行。这里要注意VB数组的索引默认从0开始,如果你想让棋盘坐标从1开始(更符合桌游的直观认知),可以显式指定上下界:

示例代码

' 模块级动态数组
Dim board() As Integer

Sub Main()
    ' 模拟获取用户输入(实际项目中可以用UI输入框、控制台输入等)
    Dim inputX As String = InputBox("请输入棋盘X轴尺寸:")
    Dim inputY As String = InputBox("请输入棋盘Y轴尺寸:")
    
    ' 转换为整数(建议加输入验证,避免非数字输入报错)
    Dim xSize As Integer = CInt(inputX)
    Dim ySize As Integer = CInt(inputY)
    
    ' 方案1:索引从0开始的数组
    ReDim board(xSize - 1, ySize - 1)
    
    ' 方案2:索引从1开始(更贴合桌游坐标习惯)
    ' ReDim board(1 To xSize, 1 To ySize)
    
    ' 现在可以初始化或操作棋盘了
    InitializeBoard()
End Sub

Private Sub InitializeBoard()
    ' 遍历棋盘初始化每个格子
    For i As Integer = LBound(board, 1) To UBound(board, 1)
        For j As Integer = LBound(board, 2) To UBound(board, 2)
            board(i, j) = 0 ' 比如用0表示空格子,换成你需要的初始值
        Next
    Next
End Sub

3. 关于ReDim Preserve的注意事项

如果之后需要调整棋盘尺寸且保留现有数据,可以用ReDim Preserve,但VB有个限制:Preserve只能调整二维数组的最后一维大小。比如:

' 只能调整Y轴尺寸,保留现有数据
ReDim Preserve board(UBound(board, 1), newYSize - 1)

如果要调整X轴尺寸,Preserve就失效了,这时候你需要手动把旧数组的数据复制到新数组里——这种情况如果频繁发生,确实不如用更灵活的结构。

4. 关于“ReDim不是最佳实践”的说法

这个观点是有前提的:

  • 如果你的棋盘尺寸只在启动时由用户设置一次,之后不再变动,那ReDim完全是高效且合适的选择,没有问题。
  • 如果你的棋盘需要频繁动态调整大小(比如支持用户中途增减行列),那用List(Of List(Of T))或者自定义的Board类会更灵活。比如用List的话,你可以直接Add或Remove行列,不用手动处理内存分配:
' 用List替代数组的示例
Dim board As New List(Of List(Of Integer))

' 添加一行
board.Add(New List(Of Integer)(Enumerable.Repeat(0, ySize)))

但对于大多数桌游场景,用户输入一次尺寸就固定了,ReDim足够用,没必要过度设计。

内容的提问来源于stack exchange,提问作者D-A UK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:47:08