用途与问题

复制数组后编辑副本中的一条记录,原数组也变了,可能是只复制了容器而没有复制每个对象。应在设计上明确副本是否需要独立对象、嵌套集合或共享只读数据,而不是简单把有 Clone 方法等同于完全隔离。

原理与实现选择

Array.Clone 创建新数组,引用类型元素的引用仍指向原来的对象。样本先改共享记录属性,确认两边可见;再替换副本数组的第一个元素,确认这次只改变副本容器中的槽位,原数组仍指向之前的对象。

适用环境与验证范围

适用环境为 PowerShell 7。本页由 AI 辅助撰写与整理;完整受控样本已在本机 PowerShell 7.6 执行并通过检查。除文件元数据样本仅操作自行创建并清理的唯一临时文件外,其余样本只操作内存或局部会话;没有连接生产服务器或修改用户配置。已核对所引 PowerShell 与 .NET 官方资料,未在 Windows PowerShell 5.1 或目标生产环境执行,版本差异需另行验证。

可执行样本

在新的 PowerShell 7 测试会话中运行以下完整代码,保留所有检查语句。先阅读样本的文件与会话影响范围,不要在生产会话中直接替换真实输入;同名函数演示结束后退出该测试会话。

$original = @([pscustomobject]@{Count=1})
$copy = $original.Clone()
if ([object]::ReferenceEquals($original,$copy)) { throw 'Container not cloned' }
$copy[0].Count = 9
if ($original[0].Count -ne 9) { throw 'Expected shared element' }
$copy[0] = [pscustomobject]@{Count=3}
if ($original[0].Count -ne 9 -or $copy[0].Count -ne 3) { throw 'Slot replacement mismatch' }
'Container copy and shared element identity checked'

预期结果与核对

两个数组容器不同,起初元素对象相同;替换副本槽位后,两边对象才分开。测试仅创建普通内存对象,未复制真实配置、文件或数据库记录。

常见误区

使用 JSON 往返也不是通用深复制:类型、循环引用和部分成员可能改变。应根据明确的数据模型逐层建立副本,保留需要的类型与身份规则。

适用边界

适用于数组容器与引用身份诊断。复杂图结构、共享节点及不可变数据需要专门策略,不能用本例保证任意对象都能安全独立复制。

参考资料