c#基础-20深拷贝与浅拷贝
Posted mr.chenyuelin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#基础-20深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。
先说结论:
浅拷贝,在修改类的属性时,值类型在栈上不是同一块内存空间(不变),而引用类型在堆上是同一块内存空间(改变)
深拷贝,在修改类的属性时,值类型和引用类型都不会是同一块内存空间,跟原来没有关系了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace test
{
class Program
{
public static void Main()
{
//创建P1对象
Person p1 = new Person();
p1.Age = 42;
p1.Name = "Sam";
p1.IdInfo = new IdInfo("081309207");
//通过浅复制 得到P2对象
Person p2 = p1.ShallowCopy();
//分别输出
Console.WriteLine("对象P1相关属性如下");
DisplayValues(p1);
p1.Name = "dd";
p1.IdInfo.IdNumber = "1234";
Console.WriteLine("对象P2相关属性如下");
DisplayValues(p2);
//现在测试深复制
Person p3 = p1.DeepCopy();
p1.Name = "George";
p1.Age = 39;
p1.IdInfo.IdNumber = "081309208";
Console.WriteLine("对象P1相关属性如下");
DisplayValues(p1);
//p1.IdInfo.IdNumber = "CCCCCCC";
Console.WriteLine("对象P3相关属性如下");
DisplayValues(p3);
Console.Read();
}
public static void DisplayValues(Person p)
{
Console.WriteLine(" Name: {0:s}, Age: {1:d}", p.Name, p.Age);
Console.WriteLine(" Value: {0:d}", p.IdInfo.IdNumber);
}
}
public class IdInfo
{
public string IdNumber;
public IdInfo(string IdNumber)
{
this.IdNumber = IdNumber;
}
}
public class Person
{
public int Age;
public string Name;
public IdInfo IdInfo;
public Person ShallowCopy()
{
return (Person)this.MemberwiseClone();
}
public Person DeepCopy()
{
Person other = (Person)this.MemberwiseClone();
other.IdInfo = new IdInfo(IdInfo.IdNumber);
other.Name = String.Copy(Name);
return other;
}
}
}
浅拷贝
//浅拷贝,复制引用但不复制引用的对象
return (T)this.MemberwiseClone();
深拷贝
//深拷贝
[Serializable]
public class BaseClone<T>
{
public virtual T Clone()
{
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, this);//序列化
stream.Position = 0;
return (T)formatter.Deserialize(stream);//反序列
}
}
深浅复制主要用于当创建一个对象需要消耗过多资源时,可以采取复制的方法提升效率!
大话设计模式的原话是这样滴:当你New一个对象时,每New一次,都需要执行一个构造函数,如果构造函数的执行时间很长,那么多次New对象时会大大拉低程序执行效率,因此:一般在初始化信息不发生变化的前提下,克隆是最好的办法,这既隐藏了对象的创建细节,又大大提升了性能!
转载:https://www.cnblogs.com/chenwolong/p/MemberwiseClone.html
以上是关于c#基础-20深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章