public class MyClass
{
    MyClass OldValue;  //用来保存副本,将来在这个里面可以取旧值    string a="aaa";
    int    n=0;
}//前提条件是:经过一系列的操作最后我得到了MyClass一个对象(myclass1)的所有值(包括值类型和引用类型)
//我现在想把myclass1复制一下(深度复制,断开所有引用,只保留当前值)赋给自身对象中的MyClass OldValue,如何操作//注:也就是说将来myclass1对象中的 string a 值变成"bbb"后,我仍然能取出MyClass OldValue中的原"aaa"值解决问题马上结帖

解决方案 »

  1.   

    //如果尝试创建一个新实例的话
    MyClass OldValue = new MyClass();//并且把当前myclass1直接赋给OldValue
    OldValue = this;//那么将来myclass1中的引用类型值改变之后OldValue中的值同样会改变,因为内存地址是相同的
      

  2.   

    那你提供copy函数,例如:
    public class MyClass
    {
    MyClass OldValue; //用来保存副本,将来在这个里面可以取旧值string a="aaa";
    public string A
    {
       get{ return a;}
       set{ a = value;}
    }int n=0;
    public int N
    {
       get{ return n;}
       set{ n = value;}
    }// provide class copy function
    public override MyClass Copy()
    {
       MyClass newObject = new MyClass();
       newObject.A = this.a;
       newObject.N = this.n;
       return newObject;
    }
    }
      

  3.   

    public class MyClass
    {
    MyClass OldValue; //用来保存副本,将来在这个里面可以取旧值
    public MyClass OLD_Value
    {
       get{ return OLD_Value.Copy();}
       set{ OldValue = value.Copy();}
    }
    string a="aaa";
    public string A
    {
    get{ return a;}
    set{ a = value;}
    }int n=0;
    public int N
    {
    get{ return n;}
    set{ n = value;}
    }// provide class copy function
    public override MyClass Copy()
    {
    MyClass newObject = new MyClass();
    newObject.A = this.a;
    newObject.N = this.n;
    return newObject;
    }
    }
      

  4.   

    楼上的写法不错但我想问句public override MyClass Copy()你用override的作用在于???
      

  5.   

    newObject.A = this.a;
    newObject.N = this.n;//这样的逐一赋值方式在我这行不通,因为我的所有属性都是在派生类中存在的,我现在根本不知道有哪些属性,除非使用反射的方法进行循环,不过这样太麻烦//还有别的方式吗?这个不是唯一解决路径吧?多谢,大家帮忙
      

  6.   

    to 这样的逐一赋值方式在我这行不通,因为我的所有属性都是在派生类中存在的,我现在根本不知道有哪些属性,除非使用反射的方法进行循环,不过这样太麻烦如果你想深copy的话,只有自己去做,系统的不可能给你提供的。
      

  7.   

    而且类的对象,在c#中是分配在堆中,如果其中出现嵌套的话,即使用以前是c或者c++的话,也是逐个进行memorycopy。
      

  8.   

    谢谢楼上热心朋友,既然是这样那我只能自己动手了
    顺便问个弱智的问题,在基类中获取当前派生类的对象名是不是this关键字?我打算使用反射逐一赋值。
      

  9.   

    另外我看到了你在另一个帖子中的回复//无法调用,怎么可能在基类能调用子类的成员或者方法。照这样说,我是不是根本就没有办法对派生类中的属性值进行深度复制了?也就是说我在改变这个派生类中的属性值之后就根本没有办法拿到原来的值了?
    (条件是不想在派生类中让操作者自己实现,我想把clone的过程封装起来)