如何在Tile类中创建Zone类型的引用字段避免编译与逻辑错误?
解决Tile类持有Zone引用的问题
核心问题分析
- C#中类是引用类型,直接声明
Zone link;并不会自动创建新的Zone实例,之前的无限循环是因为你在Tile的构造逻辑中错误地实例化了Zone,而非字段声明本身的问题。 ref关键字不能用于普通类的字段声明:编译器会将ref Zone link;误认为是声明返回引用的方法,这就是报错的原因。
正确实现方案
只需在Tile类中声明普通的Zone类型字段,通过构造函数传入当前Zone的引用(this)即可,无需使用ref。
完整代码示例
public class Zone { // 二维Tile数组,可根据需求设置访问权限 private Tile[,] _tiles; public Zone(short width, short length) { _tiles = new Tile[width, length]; // 遍历创建Tile,并将当前Zone的引用传递给每个Tile for (short x = 0; x < width; x++) { for (short y = 0; y < length; y++) { _tiles[x, y] = new Tile(this); } } } } public class Tile { // 只读的Zone引用,确保初始化后不可修改 private readonly Zone _linkedZone; // 构造函数接收Zone引用,完成赋值 public Tile(Zone zone) { _linkedZone = zone; } // 如需外部访问Zone,提供只读属性 public Zone LinkedZone => _linkedZone; }
关键说明
- 避免循环实例化:确保Tile的构造函数中不会创建新的Zone实例,仅接收外部传入的引用。
- 只读字段保障安全性:用
readonly修饰Tile的Zone字段,确保引用一旦赋值就无法更改,避免意外修改导致的逻辑错误。 - 类引用的本质:当你在Zone构造函数中传入
this给Tile时,传递的是Zone实例的引用,而非创建新的Zone对象,完全不会产生循环。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

