浅拷贝在项目中的应用

有一些概念我们清楚,但在实际中不知道如何去用,这往往是C#初学者的一个共同的问题,今天我来讲的就是“浅表拷贝”,简单来说就是把一个对象,一模一样的复制出来一份来,但浅表拷贝只复制原对象的引用地址,在改变新对象时,原来对象不会改变,而深表拷贝是完全拷贝,在改变新对象时,原对象也会受到影响

以下是浅表拷贝的实现,利用了MemberwiseClone方法

 class People
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public People ShallowCopy()
        {
            //直接使用内置的浅拷贝方法返回
            return (People)this.MemberwiseClone();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //浅拷贝后的对象的值类型字段更改不会反映到源对象,
            //而赋值运算后的对象的值类型字段更改会反映到源对象
            People p1 = new People { Name = "zzl", Email = "bfyxzls@sina.com" };
            People p2 = p1.ShallowCopy();

            Console.WriteLine(p1.Name);
            Console.WriteLine(p2.Name);
            Console.ReadKey();
        }
    }

我对深拷贝进行了封装,如果是深拷贝也类似这样去做

#region 对象的深拷贝
    //对于 Class的对象和数组,会Copy地址一份。[从而改变B时,A也被改变了],它为浅表拷贝
    //而对于其它内置的int/string/Enum/struct/object类型,则进行值copy,它为深表拷贝
    /// <summary>
    /// 警告列举
    /// </summary>
    public enum warn
    {
        /// <summary>
        /// 类型不相同 
        /// </summary>
        TypeWarn = 1,
        /// <summary>
        /// 转换成功
        /// </summary>
        Success = 2,
        /// <summary>
        /// 转换失败
        /// </summary>
        Fail = 3,
    }
    /// <summary>
    /// 泛型类
    /// </summary>
    /// <typeparam name="T1"></typeparam>
    /// <typeparam name="T2"></typeparam>
    public class Compare<T1, T2> : ICloneable where T1 : class
    {
        private T1 T11;
        /// <summary>
        /// 浅拷贝
        /// </summary>
        /// <param name="t1"></param>
        /// <param name="t2"></param>
        public warn CopyEntity(T1 t1, ref T2 t2)
        {
            T11 = t1;
            if (!t1.GetType().Equals(t2.GetType()))
                return warn.TypeWarn;
            try
            {
                t2 = (T2)this.Clone();
                return warn.Success;
            }
            catch (Exception)
            {
 
                return warn.Fail;
            }
 
        }
 
        #region ICloneable Members
 
        public object Clone()
        {
            return T11;
        }
 
        #endregion
    }
    #endregion

OK,现在我有一个people对象,希望得到一个与people对象实现p1完全相同的对象p2,如何去做,如果是去new一个people对象也是可以的,但这在开发时间的浪费是可想而知的,要把所有属性抄写一遍,现在我们可以用封装好的深拷贝来实现。

            #region 浅拷贝
            People p1 = new People { Name = "zzl", Email = "bfyxzls@sina.com" };
            People p2 = new People();
 
            Compare<People, People> c = new Compare<People, People>();
            c.CopyEntity(p1, ref p2);
            
            Console.WriteLine(p1.Name + p1.Email);
            Console.WriteLine(p2.Name + p2.Email);
            #endregion

OK, 从输出结果看这两个对象是相同的。

image

posted @ 2011-09-15 10:04  张占岭  阅读(792)  评论(1编辑  收藏  举报