我有以下代码根据Id。从上一条记录中复制新记录。
//selecting the employee to be copied.
Employee emp=employeeList.Where(p=>p.Id==2).Single();
//Increasing the Employee Id.
Employee NewEmp=new Employee();
NewEmp=emp;
NewEmp.Id=employeeList.Max(p=>p.Id)+1;
//Adding to the List.
employeeList.Add(NewEmp);
然而,新记录已成功添加。现有的记录ID也已更改为新的最大ID 3,因为它是上下文。
你可以请别人帮我停止更新现有的记录对象。答案 0 :(得分:1)
当你这样写:
Employee NewEmp=new Employee();
NewEmp=emp;
您创建新对象(第一行),然后(第二行)在变量NewEmp中指定“emp”,现在它们都引用同一个对象,因此实际上您使用一个对象。您实际创建的新员工将由GC收集。
你可以从价值类型和参考类型之间的差异中学到更多。
答案 1 :(得分:1)
你在这里做的分配:
Employee NewEmp=new Employee();
完全无效,新实例被以下行直接放弃:
NewEmp=emp;
您必须逐个字段地复制emp
的内容(逐个属性)。在您的情况下,我建议在ICloneable
- see MSDN上实施Employee
以进行备案。
另一个选择包括:
Employee
声明为结构; 但是,对于你预期的技能水平,我没有任何一种方式。
注意:通常的做法是使用小写字母来启动局部变量的名称,例如: 'newEmp'。
答案 2 :(得分:0)
您要将旧的Employee
分配给NewEmp
变量,并将NewEmp.Id
更新为3.然后您再次将相同的Employee
添加到列表中。因此,列表中有两个Employee
Id = 3
个{{1}}。
答案 3 :(得分:0)
这一行
newEmp = emp;
不会复制emp
。它只是为内存中的相同位置创建一个新引用。因此有效emp
和newEmp
是同一个但不是两个独立的内存块。阅读“参考类型”,例如在这里:http://www.albahari.com/valuevsreftypes.aspx