asp.net 里如何将数据层对象深拷贝

todayming 2010-09-08 04:50:32
举例如下
data0001 info1 =new data0001();//new第一个数据层对象
info1.id=1;//测试赋值为1
data0001 info2=new data0001();//new第二个数据层对象
info2=info1;//将对象1赋给对像2
info2.id+=1;//改变对象2的值
Response.Write(info2.id.ToString());//结果=2。
Response.Write(info1.id.ToString());//结果也为2了。
我想得到的结果是info1.id仍为1,应该不变才对。
...全文
227 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
边城的刀声 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chen_ya_ping 的回复:]
如果你的类中有了一个引用字段,你这个方法就无效了。
[/Quote]
是的,这只是浅拷贝
chen_ya_ping 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bclz_vs 的回复:]

引用 9 楼 todayming 的回复:

是啊。Clone方法必须自动实现 .
现在的问题就是,必须要把info1里的所有字段赋给info2,我知道info2.id=info1.id;就达到info1.id=1; 但info1里面有70多个字段啊,代码都要写一大堆啊,有没有办法一次性赋给info2呢

如果这些都是值类型的话,不用自己写
C# code

class Produ……
[/Quote]
如果你的类中有了一个引用字段,你这个方法就无效了。
todayming 2010-09-09
  • 打赏
  • 举报
回复
问题已解决
public class DATA0001Info : ICloneable //实现Clone接口
{
public object Clone()
{
return this.MemberwiseClone(); //返回浅clone方法
}
}
边城的刀声 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuyq11 的回复:]

对象是引用类型
指向同一个引用,修改
当然变化

浅拷贝后赋值运算后的对象的值类型字段更改会反映到源对象
[/Quote]
不会的,浅拷贝更改值类型不会反映到源对象,修改引用对象(及其包括的值类型)才会反映到源对象
边城的刀声 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 todayming 的回复:]

是啊。Clone方法必须自动实现 .
现在的问题就是,必须要把info1里的所有字段赋给info2,我知道info2.id=info1.id;就达到info1.id=1; 但info1里面有70多个字段啊,代码都要写一大堆啊,有没有办法一次性赋给info2呢
[/Quote]
如果这些都是值类型的话,不用自己写

class Product : ICloneable //: IEquatable<Product>
{
private String _name;

public Product(String name)
{
_name = name;
}

public string Name
{
get { return _name; }
set { _name = value; }
}

public object Clone()
{
return MemberwiseClone(); //调用基类的默认实现即可,它会用反射把当前对象内所有的值类型进行拷贝的
}
}

Product product1 = new Product("abc");
Product product2 = (Product) product1.Clone();
product2.Name = "New Value";
Console.WriteLine(product1.Name);
Console.WriteLine(product2.Name);
边城的刀声 2010-09-09
  • 打赏
  • 举报
回复
这个不用深拷贝,所谓深拷贝是把一个对象内的值类型和其它的引用类型都拷贝,浅拷贝只是拷贝对象内的值类型,而楼主例子中的id为值类型,所以用浅拷贝就可以实现,即直接调用object.MemberwiseClone();
wuyq11 2010-09-09
  • 打赏
  • 举报
回复
对象是引用类型
指向同一个引用,修改
当然变化

浅拷贝后赋值运算后的对象的值类型字段更改会反映到源对象
todayming 2010-09-09
  • 打赏
  • 举报
回复
是啊。Clone方法必须自动实现 .
现在的问题就是,必须要把info1里的所有字段赋给info2,我知道info2.id=info1.id;就达到info1.id=1; 但info1里面有70多个字段啊,代码都要写一大堆啊,有没有办法一次性赋给info2呢
  • 打赏
  • 举报
回复
你写到
info2=info1;
的时候就应该知道,原来的info2(所指向的对象)这时候就成了垃圾只能等着GC清理它了。这才是.net。
加油馒头 2010-09-09
  • 打赏
  • 举报
回复
看是值类型还是引用类型哦
值类型是拷贝的
引用类型就是引用
vrhero 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ltcszk 的回复:]
3l正解用clone方法
[/Quote]
正什么解?哪儿来的Clone方法?深拷贝必须自己实现...

.NET Framework类库对象也只有一部分实现了Clone方法,而且也不全是深拷贝...如Hashtable的Clone方法就是浅表复制...
ltcszk 2010-09-08
  • 打赏
  • 举报
回复
3l正解用clone方法
coco_ke 2010-09-08
  • 打赏
  • 举报
回复
引用类型传递的是地址,值类型传递的值。类属于引用类型
村长_乐 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tianshikuqi8 的回复:]
楼主什么意思?对象赋值,info2=info1;已经将info2的指向的地址修改为info1的内存单元,之后进行info2.id+=1;操作info1里单元的内容+1了,之后楼主输出当然是2了是1就不对了
[/Quote]
正解
info2=info1;是将内存单元地址...
不懂装懂 2010-09-08
  • 打赏
  • 举报
回复
这个是值类型和引用类型附值的问题吗?前几天刚学到的
ShinNakoruru 2010-09-08
  • 打赏
  • 举报
回复
info2=info1.Clone();//将对象1赋给2
辰爸 2010-09-08
  • 打赏
  • 举报
回复
楼主什么意思?对象赋值,info2=info1;已经将info2的指向的地址修改为info1的内存单元,之后进行info2.id+=1;操作info1里单元的内容+1了,之后楼主输出当然是2了是1就不对了

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧