引用类型的赋值、浅拷贝和深拷贝的区别

来源:互联网 发布:窃听噐在淘宝叫什么 编辑:程序博客网 时间:2024/06/05 16:15

ICloneable 接口:支持克隆,即用与现有实例相同的值创建类的新实例。

MemberwiseClone 方法:创建当前 System.Object 的浅表副本。

浅拷贝:给对象拷贝一份新的对象。

浅拷贝的定义 —— 只对值类型(或string)类型分配新的内存地址。

深拷贝:给对象拷贝一份全新的对象。

深拷贝的定义 —— 对值类型分配新的内存地址,引用类型、以及引用类型的内部字段分配的新的地址。

注意:

1、在 .NET 程序中,应该避免使用 ICloneable 接口。

      因为通过该接口无法判断究竟是浅拷贝还是深拷贝,这会造成误解或误用。

 

2、深拷贝应该复制该对象本身及通过该对象所能到达的完整的对象图,浅拷贝只复制对象本身(就是该对象所表示的在堆中的一块连续地址中的内容)。


 [Serializable]    public class Person : ICloneable    {        public int Age { get; set; }        public string Address { get; set; }        public Name Name { get; set; }        /*        public object Clone()  //浅拷贝        {            return this.MemberwiseClone();        }        */        public object Clone() //深度拷贝        {            using (MemoryStream ms = new MemoryStream(1000))            {                object CloneObject;                BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));                bf.Serialize(ms, this);                ms.Seek(0, SeekOrigin.Begin);                // 反序列化至另一个对象(即创建了一个原对象的深表副本)                 CloneObject = bf.Deserialize(ms);                // 关闭流                 ms.Close();                return CloneObject;            }        }    }    [Serializable]    public class Name    {        public Name(string frisName, string lastName)        {            FristName = frisName;            LastName = lastName;        }        public string FristName { get; set; }        public string LastName { get; set; }    }


http://www.cnblogs.com/jhxk/articles/1911564.html

0 0
原创粉丝点击