浅复制和深复制其实是对内存的操作,我们先从内存开始吧
栈和堆
堆栈都是在内存开辟一块空间,但是本质确不相同
栈:是为线程服务的,一个程序有多个线程且线程是可销毁的,所以栈资源可以看成临时资源
堆:是为进程服务的,一个程序只有唯一一个进程,生产周期和程序同步,所以堆资源可以看成是永久资源
值类型和引用类型
值类型:数值类型和结构体,通常情况,值类型是存放在栈中
引用类型:类和字符串,引用分为两部分,实际资源和资源地址,引用类型的值(实际资源)一定会存放在堆中.谁使用引用类型资源谁存放引用类型地址,可以是栈也可以是堆
浅复制和深复制说明
浅复制:值类型重新复制,引用类型只复制引用地址,不复制堆资源,字符串特殊都会复制.浅复制一个类,新类的值类型和字符串都会重新开辟地址,对新类的值类型和字符串操作不会影响旧类;新类的引用类型只复制地址,和旧类公用一块堆资源,新类操作引用类型,会影响旧类;
深复制:值类型和引用类型都会重新开辟地址,新旧类操作互补影响
代码实例
资源类
/// <summary>
/// 资源类
/// </summary>
public class ResourceClass
{
public int id { get; set; } = 1;
public string name { get; set; } = "test";
public ItemClass ItemClass { get; set; } = new ItemClass();
public void print(string classname) {
Console.WriteLine($"**********打印的类名称:{classname}*****************");
Console.WriteLine($"打印类内容:id={id},name={name},age={ItemClass.age},remark={ItemClass.remark}");
Console.WriteLine($"********************************************");
}
/// <summary>
/// 浅克隆
/// </summary>
/// <returns></returns>
public ResourceClass ShallowClone()
{
Console.WriteLine($"**********浅克隆*****************");
return (ResourceClass)this.MemberwiseClone();
}
/// <summary>
/// 深克隆
/// </summary>
/// <returns></returns>
public ResourceClass DeepClone()
{
Console.WriteLine($"**********深克隆*****************");
ResourceClass ResourceClass=(ResourceClass)this.MemberwiseClone();
ResourceClass.ItemClass = new ItemClass() {
age = 30,
remark = "深克隆"
};
return ResourceClass;
}
}
public class ItemClass {
public int age { get; set; } = 10;
public string remark { get; set; } = "说明";
}
操作
static void Main(string[] args)
{
ResourceClass resourceClass = new ResourceClass();
resourceClass.print("resourceClass");
ResourceClass resourceShallowClass= resourceClass.ShallowClone();
resourceShallowClass.print("resourceShallowClass");
ResourceClass resourceDeepClass = resourceClass.DeepClone();
resourceDeepClass.print("resourceShallowClass");
Console.WriteLine($"");
Console.WriteLine($"----------------对浅克隆操作------------------------");
//对浅克隆操作
resourceShallowClass.id = 22222;
resourceShallowClass.name = "浅克隆赋值";
resourceShallowClass.ItemClass.age = 22;
resourceShallowClass.ItemClass.remark = "浅克隆包含类操作";
resourceClass.print("resourceClass");
resourceShallowClass.print("resourceShallowClass");
resourceDeepClass.print("resourceShallowClass");
Console.WriteLine($"");
Console.WriteLine($"----------------对深克隆操作------------------------");
//对深克隆操作
resourceDeepClass.id = 33333;
resourceDeepClass.name = "深克隆赋值";
resourceDeepClass.ItemClass.age = 33;
resourceDeepClass.ItemClass.remark = "深克隆包含类操作";
resourceClass.print("resourceClass");
resourceShallowClass.print("resourceShallowClass");
resourceDeepClass.print("resourceShallowClass");
Console.ReadLine();
}
结果