• 浅拷贝在项目中的应用


    有一些概念我们清楚,但在实际中不知道如何去用,这往往是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

  • 相关阅读:
    Stl源码剖析读书笔记之Alloc细节
    Lua热更系统
    Linux C++线程池
    linux sort,uniq,cut,wc.
    (转)Linux grep
    用LogParser分析IIS请求压力
    (转)MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总
    AIS相关资料
    python学习笔记
    (转)MySQL InnoDB修复笔记
  • 原文地址:https://www.cnblogs.com/lori/p/2177027.html
Copyright © 2020-2023  润新知