[你必须知道的.Net]读书笔记--浅clone与深clone
时间:2022-04-23
本文章向大家介绍[你必须知道的.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 { set; get; }
public Int32 Age { set; get; }
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 { set; get; }
public Int32 Age { set; get; }
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);
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Google Analytics上实施透明度和用户意见征求框架
- 浅析鸿蒙 JavaScript GUI 技术栈
- C#串口操作类,包括串口读写操作
- Go by Example 中文版: 时间
- Go by Example 中文版: 时间戳
- Day14.模块&包
- 关于 JavaScript 错误处理的最完整指南(下半部)
- 踩坑记录 | Android 逆向之如何处理 Kali Nat 模式无法上网?
- gson 替换 fastjson 引发的线上问题分析
- P1003 铺地毯
- 花10分钟写一个 Python 脚本,搞定了初中老师一个下午的工作
- 微信小程序导航栏页面滑动切换
- SwiftUI:本地通知
- 领导大怒:建表不加主键的都是耍流氓
- (美团)巧用数组下标,轻轻松松找出所有元素