C# ICloneable,shallow clone,deep clone.

复制代码
复制代码
 1 [Serializable]
 2     public class Person:ICloneable
 3     {       
 4         public string Name { get; set; }
 5         public int Id { get; set; }
 6         public int Age { get; set; }
 7         public Department Department { get; set; }
 8 
 9         public object Clone()
10         {
11            return  this.MemberwiseClone();
12         }
13 
14 
15         public Person ShallowClone()
16         {
17             return Clone() as Person;
18         }
19 
20         public Person DeepClone()
21         {
22             using (Stream objStream = new MemoryStream())
23             {
24                 IFormatter formatter = new BinaryFormatter();
25                 formatter.Serialize(objStream, this);
26                 objStream.Seek(0, SeekOrigin.Begin);
27                 return formatter.Deserialize(objStream) as Person;
28             }
29         }
30     }
31 
32     [Serializable]
33     public class Department
34     {
35         public string DeptName { get; set; }
36         public int DeptId { get; set; }
37     }
复制代码

 



复制代码
复制代码
 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             CloneDemo();
 6             Console.ReadLine();
 7         }
 8 
 9         static void CloneDemo()
10         {
11             Person fred = new Person()
12             {
13                 Id = 1,
14                 Name = "Fred",
15                 Age = 32,
16                 Department=new Department()
17                 {
18                     DeptId=1,
19                     DeptName="Dept1"
20                 }
21             };
22 
23             Console.WriteLine($"fred,name:{fred.Name},Id:{fred.Name},department name:{fred.Department.DeptName},deptid:{fred.Department.DeptId}");
24 
25             Person shallowClonePerson = fred.ShallowClone() as Person;
26             Console.WriteLine($"shallowClonePerson,Name:{shallowClonePerson.Name},Id:{shallowClonePerson.Id},department name:{shallowClonePerson.Department.DeptName},deptId:{shallowClonePerson.Department.DeptId}");
27 
28             fred.Id = 2;
29             fred.Name = "fred2";
30             fred.Age = 33;
31             fred.Department.DeptId = 2;
32             fred.Department.DeptName = "dept2";
33             Console.WriteLine($"shallowClonePerson,Name:{shallowClonePerson.Name},Id:{shallowClonePerson.Id},department name:{shallowClonePerson.Department.DeptName},deptId:{shallowClonePerson.Department.DeptId}");
34 
35 
36             Person deepClonePerson = fred.DeepClone() as Person;                      
37             Console.WriteLine($"deepClonePerson,Name:{deepClonePerson.Name},Id:{deepClonePerson.Id},department name:{deepClonePerson.Department.DeptName},id:{deepClonePerson.Department.DeptId}");
38                         
39             fred.Id = 3;
40             fred.Name = "Fred3";
41             fred.Age = 34;
42             fred.Department.DeptId = 3;
43             fred.Department.DeptName = "dept3";
44             Console.WriteLine($"deepClonePerson,Name:{deepClonePerson.Name},Id:{deepClonePerson.Id},department name:{deepClonePerson.Department.DeptName},id:{deepClonePerson.Department.DeptId}");
45         }
46 }
复制代码

 

posted @   FredGrit  阅读(312)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示