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

发布网友 发布时间:2022-04-23 05:33

我来回答

1个回答

热心网友 时间:2022-05-19 15:04

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

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);
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com