zoukankan      html  css  js  c++  java
  • 深拷贝与浅拷贝

    浅拷贝

    浅拷贝是字段的被拷贝,而字段的引用的对象不会被拷贝,拷贝对象和源对象仅仅是引用名称有所不同,他们公用一份实体,改变其中一个都会影响到因为一个对象。

    void Main()
    { 
        Student s1=new Student("objectboy",27);
        Student s2=s1;
        s2.Age=20;
        s1.ShowInfo();
        s1.Age=11;
        s2.ShowInfo();
    }
    
    public class Student{
        public string Name;
        public int Age;
        public Student(string name,int age){
            Name=name;
            Age=age;
        }
        public void ShowInfo(){
            Console.WriteLine("{0}'s age is {1} ",Name,Age);
        }
    }
    输出:
    objectboy's age is 20 
    objectboy's age is 11 
    

     深拷贝

    对象的字段拷贝,同时对象的引用也被拷贝,不共用一个对象,改变其中一个对象不会影响到另外一个对象(一般值类型的拷贝就是深拷贝)。

    void Main()
    {
        int i=0;
        int j=i;
        i=2;
        Console.WriteLine(i);
        Console.WriteLine(j);
    }
    输出:
    2
    0

     浅拷贝实现

    void Main()
    {
        var sourceEnrollment=new Enrollment();
        sourceEnrollment.students.Add(new Student(){Name="objectboy",Age=27});
        sourceEnrollment.students.Add(new Student(){Name="hky",Age=27});
        
        Enrollment cloneStudents=sourceEnrollment.Clone() as Enrollment;  //克隆
        sourceEnrollment.ShowEnrollmentInfo();
        cloneStudents.ShowEnrollmentInfo();
        
        Console.WriteLine("------------------------------");
        
        cloneStudents.students[0].Name="boyobject";
        cloneStudents.students[0].Age=22;
        sourceEnrollment.ShowEnrollmentInfo();
        cloneStudents.ShowEnrollmentInfo();
    }
    
    class Enrollment:ICloneable{
        public  List<Student> students=new List<Student>();
        public void ShowEnrollmentInfo(){
            foreach (var element in students)
            {
                Console.WriteLine("{0}'s age is {1}",element.Name,element.Age);
            }
        }
        public object Clone(){
            return MemberwiseClone();
        }
    }
    public class Student{
        public string Name{get;set;}
        public int Age{get;set;}
    }
    输出:
    objectboy's age is 27
    hky's age is 27
    objectboy's age is 27
    hky's age is 27
    ------------------------------
    boyobject's age is 22
    hky's age is 27
    boyobject's age is 22
    hky's age is 27
  • 相关阅读:
    重视个人成长 远离心灵鸡汤——由一则“心灵鸡汤”想到的
    vim 学习
    针对不同包之间的action跳转,怎么配置?
    Bootstrap 栅格系统
    struts2的s:iterator 标签 详解
    struts2 <s:property/>标签的使用--输出时间格式转换
    Myeclipse中把java代码导成UML类图
    大学毕业后坚持学习有什么用
    【BZOJ2754】喵星球上的点名(AC自动机)
    Codeforces Round #466 (Div. 2)
  • 原文地址:https://www.cnblogs.com/objectboy/p/4623231.html
Copyright © 2011-2022 走看看