当前位置:编程学习 > C#/ASP.NET >>

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

举例如下
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,应该不变才对。  --------------------编程问答-------------------- 楼主什么意思?对象赋值,info2=info1;已经将info2的指向的地址修改为info1的内存单元,之后进行info2.id+=1;操作info1里单元的内容+1了,之后楼主输出当然是2了是1就不对了 --------------------编程问答-------------------- --------------------编程问答-------------------- info2=info1.Clone();//将对象1赋给2 --------------------编程问答-------------------- 这个是值类型和引用类型附值的问题吗?前几天刚学到的 --------------------编程问答--------------------
引用 1 楼 tianshikuqi8 的回复:
楼主什么意思?对象赋值,info2=info1;已经将info2的指向的地址修改为info1的内存单元,之后进行info2.id+=1;操作info1里单元的内容+1了,之后楼主输出当然是2了是1就不对了

正解
info2=info1;是将内存单元地址... --------------------编程问答-------------------- 引用类型传递的是地址,值类型传递的值。类属于引用类型 --------------------编程问答-------------------- 3l正解用clone方法 --------------------编程问答--------------------
引用 7 楼 ltcszk 的回复:
3l正解用clone方法

正什么解?哪儿来的Clone方法?深拷贝必须自己实现...

.NET Framework类库对象也只有一部分实现了Clone方法,而且也不全是深拷贝...如Hashtable的Clone方法就是浅表复制... --------------------编程问答-------------------- 是啊。Clone方法必须自动实现 .
现在的问题就是,必须要把info1里的所有字段赋给info2,我知道info2.id=info1.id;就达到info1.id=1; 但info1里面有70多个字段啊,代码都要写一大堆啊,有没有办法一次性赋给info2呢 --------------------编程问答-------------------- 对象是引用类型
指向同一个引用,修改
当然变化

浅拷贝后赋值运算后的对象的值类型字段更改会反映到源对象  --------------------编程问答-------------------- --------------------编程问答-------------------- 这个不用深拷贝,所谓深拷贝是把一个对象内的值类型和其它的引用类型都拷贝,浅拷贝只是拷贝对象内的值类型,而楼主例子中的id为值类型,所以用浅拷贝就可以实现,即直接调用object.MemberwiseClone(); --------------------编程问答--------------------
引用 9 楼 todayming 的回复:
是啊。Clone方法必须自动实现 .
现在的问题就是,必须要把info1里的所有字段赋给info2,我知道info2.id=info1.id;就达到info1.id=1; 但info1里面有70多个字段啊,代码都要写一大堆啊,有没有办法一次性赋给info2呢

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

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);
--------------------编程问答--------------------
引用 10 楼 wuyq11 的回复:
对象是引用类型
指向同一个引用,修改
当然变化

浅拷贝后赋值运算后的对象的值类型字段更改会反映到源对象

不会的,浅拷贝更改值类型不会反映到源对象,修改引用对象(及其包括的值类型)才会反映到源对象 --------------------编程问答-------------------- 问题已解决
 public class DATA0001Info : ICloneable //实现Clone接口
   {
        public object Clone()
        {
            return this.MemberwiseClone(); //返回浅clone方法
        } 
    } --------------------编程问答--------------------
引用 13 楼 bclz_vs 的回复:
引用 9 楼 todayming 的回复:

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

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

class Produ……

如果你的类中有了一个引用字段,你这个方法就无效了。 --------------------编程问答--------------------
引用 16 楼 chen_ya_ping 的回复:
如果你的类中有了一个引用字段,你这个方法就无效了。

是的,这只是浅拷贝 --------------------编程问答-------------------- 看是值类型还是引用类型哦
值类型是拷贝的
引用类型就是引用 --------------------编程问答-------------------- 你写到
info2=info1;
的时候就应该知道,原来的info2(所指向的对象)这时候就成了垃圾只能等着GC清理它了。这才是.net。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,