不同DTO间参数赋值后for循环得到的obj1元素全部相同是什么问题
问题背景
以下是将一个DTO的参数赋值给另一个DTO的实现代码:
List<Projectdto> matchedProjects = new List<Projectdto>(); List<Projectdto> obj1 = new List<Projectdto>(); List<ProjectDTO> obj = matchedProjectsDetails; Projectdto projectdto = new Projectdto(); for (int i = 0; i < matchedProjectsDetails.Count; i++) { projectdto.Name = obj[i].Name; projectdto.PID = obj[i].PID; projectdto.PNKC = obj[i].MatchedPNKC; projectdto.PNKCCount = obj[i].MatchedPnkcCount; obj1.Add(projectdto); }
执行完上述for循环后,obj1中的所有元素参数都完全相同,问题原因及修复方案如下:
错误原因
Projectdto属于C#中的引用类型,代码中该类的实例化操作放在了for循环外部,全程只有一个实例对象被创建。每次循环修改的都是该实例的属性,往obj1中添加的也只是该实例的内存引用,而非新的独立对象。最后一次循环的赋值会覆盖之前所有修改,导致列表内所有引用指向的对象属性值完全一致。
修复方案
将Projectdto实例化代码移动到for循环内部,每次循环创建一个新的独立实例:
List<Projectdto> matchedProjects = new List<Projectdto>(); List<Projectdto> obj1 = new List<Projectdto>(); List<ProjectDTO> obj = matchedProjectsDetails; for (int i = 0; i < matchedProjectsDetails.Count; i++) { // 每次循环创建新实例 Projectdto projectdto = new Projectdto(); projectdto.Name = obj[i].Name; projectdto.PID = obj[i].PID; projectdto.PNKC = obj[i].MatchedPNKC; projectdto.PNKCCount = obj[i].MatchedPnkcCount; obj1.Add(projectdto); }
内容的提问来源于stack exchange,提问作者Rutuja
相关产品推荐
相关产品推荐

