zoukankan      html  css  js  c++  java
  • [你必须知道的.Net]读书笔记浅clone与深clone

    按照书上的代码,深克隆的示例代码编译没通过(可能是印刷时漏掉了某一行代码),所以重新修改了下,贴在这里以供阅读本书时跟我遇到一样问题的园友参考:

    浅克隆示例:
    要点:克隆之后,新旧对象还是指向同一个引用,不管修改哪一个对象,都会影响另一个对象

    namespace CloneTest
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {          

                Enrollment sourceStudentsList 
    = new Enrollment();
                sourceStudentsList.students.Add(
    new Student() { Name = "王小二", Age = 27 });
                sourceStudentsList.students.Add(
    new Student() { Name = "张三", Age = 22 });

                Enrollment cloneStudentsList 
    = sourceStudentsList.Clone() as Enrollment;

                sourceStudentsList.ShowEnrollmentInfo(
    "source");
                Console.WriteLine(
    "----------------------------------------------------------------");
                cloneStudentsList.ShowEnrollmentInfo(
    "clone");

                cloneStudentsList.students[
    1].Name = "李四";
                cloneStudentsList.students[
    1].Age = 36;
                
                Console.WriteLine(
    "----------------------------------------------------------------");
                Console.WriteLine(
    "浅clone之后,修改clone对象将影响source对象");
                Console.WriteLine(
    "----------------------------------------------------------------");
                sourceStudentsList.ShowEnrollmentInfo(
    "source");
                Console.WriteLine(
    "----------------------------------------------------------------");
                cloneStudentsList.ShowEnrollmentInfo(
    "clone");

                Console.ReadLine();
            }
        }


        
    class Student
        {
            
    public string Name { setget; }
            
    public Int32 Age { setget; }
           

            
    public void ShowInfo()
            {
                Console.WriteLine(
    "{0}'s age is {1}", Name, Age);
            }
        }


        
    class Enrollment : ICloneable 
        {
            
    public List<Student> students = new List<Student>();

            
    public void ShowEnrollmentInfo(string Prefix) {
                Console.WriteLine(Prefix 
    + " Students enrollment infomation:");
                
    foreach (Student s in students)
                {
                    s.ShowInfo();
                }
            }       

            
    public object Clone() {
                
    return MemberwiseClone();
            }
        }
    }
    深克隆示例:
    要点:深克隆要求完成克隆后,不管如何设置克隆出的新对象,都不会影响源对象(即新旧对象完全不相干)
    using System;
    using System.Collections.Generic;

    namespace CloneTest
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {          

                Enrollment sourceStudentsList 
    = new Enrollment();
                sourceStudentsList.students.Add(
    new Student() { Name = "王小二", Age = 27 });
                sourceStudentsList.students.Add(
    new Student() { Name = "张三", Age = 22 });


                Enrollment cloneStudentsList 
    = sourceStudentsList.Clone() as Enrollment;

                sourceStudentsList.ShowEnrollmentInfo(
    "source");
                Console.WriteLine(
    "----------------------------------------------------------------");
                cloneStudentsList.ShowEnrollmentInfo(
    "clone");

                cloneStudentsList.students[
    1].Name = "李四";
                cloneStudentsList.students[
    1].Age = 36;
                
                Console.WriteLine(
    "----------------------------------------------------------------");
                Console.WriteLine(
    "深clone之后,修改clone对象不影响source对象");
                Console.WriteLine(
    "----------------------------------------------------------------");
                sourceStudentsList.ShowEnrollmentInfo(
    "source");
                Console.WriteLine(
    "----------------------------------------------------------------");
                cloneStudentsList.ShowEnrollmentInfo(
    "clone");

                Console.ReadLine();
            }
        }


        
    class Student
        {
            
    public string Name { setget; }
            
    public Int32 Age { setget; }
           

            
    public void ShowInfo()
            {
                Console.WriteLine(
    "{0}'s age is {1}", Name, Age);
            }
        }


        
    class Enrollment : ICloneable 
        {
            
    public List<Student> students = new List<Student>();

            
    public void ShowEnrollmentInfo(string Prefix) {
                Console.WriteLine(Prefix 
    + " Students enrollment infomation:");
                
    foreach (Student s in students)
                {
                    s.ShowInfo();
                }
            }

            
    //提供一个默认的公有构架函数,以保证Enrollment sourceStudentsList = new Enrollment();能正常编译通过
            public Enrollment() { }

            
    /// <summary>
            
    /// 提供了一个私有构造函数
            
    /// </summary>
            
    /// <param name="studentList"></param>
            private Enrollment(List<Student> studentList) 
            {
                
    foreach (Student s in studentList)
                {
                    students.Add(
    new Student() { Name = s.Name, Age = s.Age });//注:原书P309的代码students.Add((Student)s.Clone());编译通不过--提示Student没有Clone方法,所以换成了这个
                }
            }

            
    public object Clone() {
                
    return new Enrollment(students);
            }
        }
    }
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    CSharpGL(36)通用的非托管数组排序方法
    CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口
    CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL
    CSharpGL(33)使用uniform块来优化对uniform变量的读写
    CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换
    CSharpGL(31)[译]OpenGL渲染管道那些事
    CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率
    Go如何使用数据库、缓存
    Go内置常用包
    从零开始基于go-thrift创建一个RPC服务
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1454013.html
Copyright © 2011-2022 走看看