浅拷贝在项目中的应用

有一些概念我们清楚,但在实际中不知道如何去用,这往往是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 @   张占岭  阅读(793)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示