MemberwiseClone与Clone

来源:互联网 发布:cms监控软件录像回放 编辑:程序博客网 时间:2024/05/21 03:19

MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

下面的代码就是演示这个问题:

using System;using System.IO;using System.Runtime.Serialization.Formatters.Binary;namespace CloneDemo{    [Serializable]    class DemoClass    {        public int i = 0;        public int[] iArr = { 1, 2, 3 };        public DemoClass Clone1()        {            return this.MemberwiseClone() as DemoClass;        }        public DemoClass Clone2()        {            MemoryStream stream = new MemoryStream();            BinaryFormatter formatter = new BinaryFormatter();            formatter.Serialize(stream, this);            stream.Position = 0;            return formatter.Deserialize(stream) as DemoClass;        }    }    class Program    {        static void Main(string[] args)        {            DemoClass a = new DemoClass();            a.i = 10;            a.iArr = new int[] { 8, 9, 10 };            DemoClass b = a.Clone1();            DemoClass c = a.Clone2();            // 更改 a 对象的iArr[0], 导致 b 对象的iArr[0] 也发生了变化              a.iArr[0] = 88;            Console.WriteLine("MemberwiseClone");            Console.WriteLine(b.i);            foreach (var item in b.iArr)            {                Console.WriteLine(item);            }            Console.WriteLine("Clone2");            Console.WriteLine(c.i);            foreach (var item in c.iArr)            {                Console.WriteLine(item);            }            Console.ReadLine();        }    }}
原创粉丝点击