浅拷贝在项目中的应用

简介:

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

本文转自博客园张占岭(仓储大叔)的博客,原文链接:浅拷贝在项目中的应用,如需转载请自行联系原博主。

目录
相关文章
|
6月前
|
存储 人工智能 前端开发
深拷贝浅拷贝的区别?如何实现一个深拷贝?
深拷贝浅拷贝的区别?如何实现一个深拷贝?
103 0
|
1月前
|
存储 前端开发 JavaScript
浅拷贝和深拷贝的区别?
本文首发于微信公众号“前端徐徐”,介绍了JavaScript中浅拷贝和深拷贝的概念及其实现方法。文章首先解释了数据类型的基础,包括原始值和对象的区别,然后详细介绍了浅拷贝和深拷贝的定义、底层逻辑以及常见的实现方式,如 `Object.assign`、扩展运算符、`JSON.stringify` 和手动实现等。最后,通过对比浅拷贝和深拷贝的区别,帮助读者更好地理解和应用这两种拷贝方式。
45 0
浅拷贝和深拷贝的区别?
|
5月前
|
安全 Java
深拷贝和浅拷贝的区别
深拷贝和浅拷贝的区别
|
6月前
|
Java
对引用拷贝,浅拷贝,深拷贝的理解
对引用拷贝,浅拷贝,深拷贝的理解
34 0
|
6月前
|
存储 Java Apache
【面试问题】深拷贝和浅拷贝的区别?
【1月更文挑战第27天】【面试问题】深拷贝和浅拷贝的区别?
|
JavaScript
一文弄懂浅拷贝和深拷贝
一文弄懂浅拷贝和深拷贝
50 0
|
存储 JavaScript 前端开发
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
深拷贝浅拷贝有什么区别?怎么实现深拷贝?
94 0
|
JSON 数据格式
深拷贝和浅拷贝、及实现方式
深拷贝和浅拷贝、及实现方式
94 0
C++学习笔记_06 深拷贝和浅拷贝 2021-04-19
C++学习笔记_06 深拷贝和浅拷贝 2021-04-19
|
存储 JSON 缓存
前端面试:浅拷贝和深拷贝的区别?
前端面试:浅拷贝和深拷贝的区别?
119 0