转:C#之深拷贝和浅拷贝的区别

 我来答
仙戈雅3n
2017-05-15 · TA获得超过5789个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:860万
展开全部

深拷贝和浅拷贝区别如下:

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);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式