一般的等号赋值只是传递引用,请问如何能得到对象的拷贝?

解决方案 »

  1.   

    clone()啊 !!~~
    这是每个对象都有的属性!!~~
      

  2.   

    要完全做到深拷贝,可以用序列化机制
    可以用XmlSerializer,或者Binary/Soap Formatter先序列化,再反序列化
    前提是此对象支持序列化操作
      

  3.   

    好像只能自己重载=函数,或者专门编写一个copy函数吧
      

  4.   

    好像只能自己重载=函数,或者专门编写一个copy函数吧
      

  5.   

    如果这个对象的类实现了ICloneable接口的话,那么就可以通过obj.Clone()实现,这应该叫深拷贝吧。其它的好像只能通过序列化与反序列化来实现。在《.NET框架程序设计》书里面有这部分内容。
      

  6.   

    to beibei_137(beibei):
    Object.MemberwiseClone是浅拷贝
    基本上没用
      

  7.   

    to rib06(排骨):
    实现了ICloneable的类并不一定就支持深拷贝
    比如class Array
      

  8.   

    Sunmast(速马/Maybe I'm Amazed) 
    的方法是最好的,写少很多代码,而且对任何一种类型的对象都适用,不过不一定用Xml序列化,用MemoryStream,序列化到流在返回这样的速度更好
      

  9.   

    呵呵,谢谢Sunmast纠正:)那看来就只有序列化与反序列化了,这种方法没用过,是不是很麻烦啊。就是出于避免指针操作这种“不安全代码”的目的么?
      

  10.   

    >>> 那看来就只有序列化与反序列化了,这种方法没用过,是不是很麻烦啊。
    >>> 就是出于避免指针操作这种“不安全代码”的目的么?嗯,倒不是不安全代码的问题
    比如这样一个class:
    class Person
    {
    public string Name;
    }
    建立一个Person对象:
    Person p1 = new Person();
    p1.Name = "Sunmast";
    复制给另外一个引用:
    Person p2 = p1;
    p2.Name = "Xiawei";那么此时p1.Name = ? 应该也变成"Xiawei"了
    如果是深拷贝,就不会出现这种问题,p1和p2应该完全独立
      

  11.   

    有兴趣的也可以试验一下struct,结果相反
      

  12.   

    谢谢大家的热情帮助想不到这个小问题还引来了这么多讨论看来还是老板的实现方法比较严谨,本以为可以用clone或者copy函数就可以解决的