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的元素能自动跟上原数组的变化,不能直接复制元素值,得每次都去原数组里取最新值:
- 用只读属性实时读取原数组:
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,都会直接去原数组里拿最新的元素值。
- 或者写个方法来获取:
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
相关产品推荐
相关产品推荐

