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

C#原数组修改后克隆数组未同步更新的问题咨询

为什么修改原数组元素后,克隆数组的对应元素未同步更新?

我定义了原数组gridPlacement如下:

class gridMemory
{
    static public string[] gridPlacement =
        new string[9] {"x", "b", "c", "h", null, null, null, null, null };
}

随后创建了仅包含原数组部分元素的克隆数组p1:

class handleWinLost
{
    static public string[] p1 = new string[3] {
        gridMemory.gridPlacement[0],
        gridMemory.gridPlacement[3],
        gridMemory.gridPlacement[2]
    };
}

当我将原数组gridPlacement索引2的元素从"c"修改为"b"后,发现p1的最后一个元素仍为"c",并未同步更新,尽管p1[2]原本对应gridMemory.gridPlacement[2],请问这是什么原因?


核心原因:赋值只是复制引用快照,没有动态绑定关系

  • C#里的string是引用类型,但它有个关键特性:一旦创建就无法修改。你执行gridMemory.gridPlacement[2] = "b"的时候,并不是把原来的"c"改成了"b",而是新建了一个"b"字符串对象,然后让原数组的索引2位置指向这个新对象。
  • 初始化p1数组时,p1[2] = gridMemory.gridPlacement[2]这个操作,只是把当时原数组索引2指向的"c"对象的引用值复制给了p1[2]。这就像你把朋友的手机号存进自己通讯录,之后朋友换了手机号,你通讯录里的旧号码不会自动更新——你只是复制了当时的信息,没建立实时关联。
  • 所以当原数组索引2换了指向的对象后,p1[2]手里还是原来"c"对象的引用,自然不会同步变成"b"。

如果要实现同步更新,可以这么做

要是想让p1的元素能自动跟上原数组的变化,不能直接复制元素值,得每次都去原数组里取最新值:

  1. 用只读属性实时读取原数组:
class handleWinLost
{
    static public string P1First => gridMemory.gridPlacement[0];
    static public string P1Second => gridMemory.gridPlacement[3];
    static public string P1Third => gridMemory.gridPlacement[2];
}

之后每次访问handleWinLost.P1Third,都会直接去原数组里拿最新的元素值。

  1. 或者写个方法来获取:
class handleWinLost
{
    static public string GetP1Element(int position)
    {
        return position switch
        {
            0 => gridMemory.gridPlacement[0],
            1 => gridMemory.gridPlacement[3],
            2 => gridMemory.gridPlacement[2],
            _ => throw new ArgumentOutOfRangeException(nameof(position))
        };
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:25:31