转:C#之深拷贝和浅拷贝的区别
1个回答
展开全部
深拷贝和浅拷贝区别如下:
1)浅拷贝:简单的复制堆栈的内容,对于值类型,堆栈内容是其值本身,对于引用类型,其值为托管堆的内存地址,对拷贝的对象的修改会反映到被拷贝的对象。
2)深拷贝:不管是值类型还是引用类型,其值均为真正的副本,对于值类型,堆栈内容是其值本身,对于引用类型,其值为托管堆的保存的具体的值(这个动作称为克隆),是克隆对象的值,不是它的内存地址,对拷贝的对象的修改不会反映到被拷贝的对象。深拷贝本质上就是软件设计模式里的原型模式。与C#对应的接口是ICloneable
class Foo:ICloneable{
public String Bar{get;set;}
public override string ToString(){
return "Bar="+this.Bar;
}
public object Clone(){
return new Foo() { Bar = this.Bar };
}
}
static void Main(string[] args){
Console.WriteLine("===========浅拷贝=============");
Foo foo = new Foo() { Bar = "Old Value" };
Foo copy = foo;
Console.WriteLine("浅拷贝修改副本前:"+foo);
copy.Bar = "New Value"; // 修改副本会反映到被拷贝的对象
Console.WriteLine("浅拷贝修改副本后:" + foo);
Console.WriteLine("===========深拷贝=============");
Foo foo2 = new Foo() { Bar = "Old Value" };
Foo copy2 = foo2.Clone() as Foo;
Console.WriteLine("深拷贝修改副本前:" + foo);
copy2.Bar = "New Value";// 修改副本不会反映到被拷贝的对象
Console.WriteLine("深拷贝修改副本后:" + foo);
Console.ReadKey(true);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询