永发信息网

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

答案:1  悬赏:0  手机版
解决时间 2021-03-29 09:36
  • 提问者网友:末路
  • 2021-03-28 11:31
转:C#之深拷贝和浅拷贝的区别
最佳答案
  • 五星知识达人网友:一叶十三刺
  • 2021-03-28 12:22
深拷贝和浅拷贝区别如下:
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);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯