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

