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

C#中类内未知尺寸的二维对象数组初始化与调整问题咨询

C#中类内未知尺寸的二维对象数组初始化与调整问题咨询

嗨,我来帮你理清这个问题的解决思路~

首先得明确一个关键知识点:C#里的数组一旦创建,长度就是固定的,没法直接“调整大小”——所谓的调整其实是创建一个新的数组,然后把原来的字段引用指向新数组。这也是你之前找不到“resize”方法的原因。

针对你的场景,我给你几个实用的解决方案:

方案1:将字段设为可空或初始化空数组,后续赋值新数组

首先解决你遇到的CS8618警告,有两种方式:

  • 把字段声明为可空引用类型:
    public class World
    {
        // 加?标记为可空,告诉编译器这个字段可能暂时为null
        Square[,]? squareGrid;
        public World(ref DimensionsAndStuff dimstuffIn)
        {
            // 其他初始化逻辑
        }
    
        // 后续GUI确定尺寸后调用这个方法创建数组
        public void InitializeGrid(int width, int height)
        {
            squareGrid = new Square[width, height];
            // 这里可以按需初始化每个Square对象,比如遍历数组赋值
        }
    }
    
  • 或者直接初始化一个空的0×0数组,避免可空标记:
    public class World
    {
        // 初始化空数组,满足非空要求
        Square[,] squareGrid = new Square[0,0];
        public World(ref DimensionsAndStuff dimstuffIn)
        {
            // 其他初始化逻辑
        }
    
        public void ResizeGrid(int width, int height)
        {
            // 创建新的数组替换旧的
            squareGrid = new Square[width, height];
        }
    }
    

这种方式最直接,符合你想用二维数组的需求,后续只要调用方法传入GUI确定的宽高就能“调整”数组大小。

方案2:用嵌套List模拟二维网格(灵活度更高)

你提到觉得List不是解决方案,但其实嵌套的List<List<Square>>完全可以模拟二维网格,而且支持动态调整大小,不用频繁创建新数组:

public class World
{
    List<List<Square>> squareGrid = new List<List<Square>>();
    public World(ref DimensionsAndStuff dimstuffIn)
    {
        // 其他初始化逻辑
    }

    public void InitializeGrid(int width, int height)
    {
        squareGrid.Clear();
        for (int y = 0; y < height; y++)
        {
            // 每行创建指定宽度的List
            squareGrid.Add(new List<Square>(width));
            // 按需初始化每行的Square对象
            for (int x = 0; x < width; x++)
            {
                squareGrid[y].Add(new Square());
            }
        }
    }

    // 访问元素的方式和数组类似:squareGrid[y][x]
}

这种方式适合需要频繁调整网格大小的场景,而且不用处理数组引用替换的问题。

方案3:封装Grid类,模块化管理网格逻辑

如果你的网格后续有更多操作(比如元素复制、边界检查等),可以封装一个专门的Grid类,把数组的初始化、调整逻辑都放在里面:

public class Grid
{
    public Square[,] Squares { get; private set; }

    public Grid()
    {
        // 初始化空数组
        Squares = new Square[0,0];
    }

    public void Resize(int width, int height)
    {
        // 这里可以添加逻辑:如果需要保留原有网格的元素,就遍历旧数组复制到新数组
        Squares = new Square[width, height];
        // 初始化新网格的Square对象
        for (int x = 0; x < width; x++)
        {
            for (int y = 0; y < height; y++)
            {
                Squares[x,y] = new Square();
            }
        }
    }
}

public class World
{
    Grid squareGrid;
    public World(ref DimensionsAndStuff dimstuffIn)
    {
        squareGrid = new Grid();
        // 其他初始化逻辑
    }

    // GUI确定尺寸后调用
    public void SetGridSize(int width, int height)
    {
        squareGrid.Resize(width, height);
    }
}

这种方式代码更整洁,也更易于维护,适合复杂的网格操作场景。

总结一下:如果就想坚持用二维数组,方案1最直接;如果需要动态调整的灵活性,方案2更合适;如果项目后续有扩展需求,方案3的封装方式更优雅。

备注:内容来源于stack exchange,提问作者Developer Nightlife

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 11:42:39