C#如何为自定义Tile类数组设置对应位置的BlankTile默认值?
解决方案说明
首先明确:C#中引用类型数组在创建时,所有元素默认初始化为null,不会自动生成BlankTile实例,你提供的示例代码运行时会抛出NullReferenceException,无法得到预期输出。以下是几种可行的实现方案:
方案一:直接循环初始化数组
这是最直观简便的方式,创建数组后遍历索引,为每个位置生成对应坐标的BlankTile:
// 假设一维数组的x为索引值,y固定为0(可根据你的游戏逻辑调整坐标规则) int arrayLength = 5; Tile[] tiles = new Tile[arrayLength]; for (int i = 0; i < arrayLength; i++) { tiles[i] = new BlankTile(i, 0); } foreach(Tile aTile in tiles) { Console.WriteLine(aTile.GetType().ToString()); } // 输出: // BlankTile // BlankTile // BlankTile // BlankTile // BlankTile
方案二:封装初始化方法复用逻辑
如果需要多次创建这类数组,可以封装一个静态方法,统一处理初始化逻辑:
public static class TileArrayFactory { // 一维数组初始化方法 public static Tile[] CreateOneDimensionalArray(int length, int fixedY = 0) { Tile[] tiles = new Tile[length]; for (int i = 0; i < length; i++) { tiles[i] = new BlankTile(i, fixedY); } return tiles; } // 二维数组初始化方法(更符合游戏背景的常见场景) public static Tile[,] CreateTwoDimensionalArray(int width, int height) { Tile[,] tiles = new Tile[width, height]; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { tiles[x, y] = new BlankTile(x, y); } } return tiles; } } // 使用示例 Tile[] oneDTiles = TileArrayFactory.CreateOneDimensionalArray(5); Tile[,] twoDTiles = TileArrayFactory.CreateTwoDimensionalArray(10, 10);
代码优化建议
你提供的Tile和BlankTile类存在冗余代码,可优化如下:
- 将
position改为公开只读属性,避免子类重复赋值 - 子类构造函数无需再次初始化
position,直接调用父类构造即可
using System.Drawing; // 需引用System.Drawing.dll或使用自定义Point类 abstract class Tile { public Point Position { get; } public Tile(int x, int y) => Position = new Point(x, y); } public class BlankTile : Tile { public BlankTile(int x, int y) : base(x, y) { } }
内容的提问来源于stack exchange,提问作者EtherealChilly
相关产品推荐
相关产品推荐

