如何在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
相关产品推荐
相关产品推荐

