使用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
相关产品推荐
相关产品推荐

