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

使用DeepCloner未成功复制属性?问题排查求助

问题原因与解决方法

问题根源

C#中引用类型的参数默认是按值传递的——传递的是变量的引用副本,而非变量本身。在PerformDeepCloning方法里,destination = source.DeepClone()只是将新克隆出的对象引用赋值给了方法内部的局部变量destination,这个操作不会影响外部的clonedPerson变量。外部的clonedPerson仍是你最初创建的、IdInfo为null的实例,因此调用DisplayValues时访问p.IdInfo.IdNumber会触发空引用异常。

修复方案

有两种常见的解决方式:

方式1:让方法返回克隆后的对象

修改PerformDeepCloning方法,直接返回克隆结果,外部接收该返回值:

public static Person PerformDeepCloning(Person source)
{
    var cloned = source.DeepClone();
    Console.WriteLine("DEEP CLONED NAME = " + cloned.Name);
    return cloned;
}

在Main方法中调用:

Person clonedPerson = PerformDeepCloning(p1);

方式2:使用ref关键字传递参数

若要通过参数传递修改外部变量,给参数添加ref关键字,让方法直接操作外部变量的引用:

public static void PerformDeepCloning(Person source, ref Person destination)
{
    destination = source.DeepClone();
    Console.WriteLine("DEEP CLONED NAME = " + destination.Name);
}

调用时需同步添加ref关键字:

PerformDeepCloning(p1, ref clonedPerson);

补充说明

你最初创建clonedPerson = new Person()属于多余操作,无论采用哪种修复方式,最终都会将该实例替换为克隆后的对象,因此可直接声明变量无需初始化:

Person clonedPerson;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:10:26