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

如何在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;
}

关键说明

  1. 避免循环实例化:确保Tile的构造函数中不会创建新的Zone实例,仅接收外部传入的引用。
  2. 只读字段保障安全性:用readonly修饰Tile的Zone字段,确保引用一旦赋值就无法更改,避免意外修改导致的逻辑错误。
  3. 类引用的本质:当你在Zone构造函数中传入this给Tile时,传递的是Zone实例的引用,而非创建新的Zone对象,完全不会产生循环。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:05:21