问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

net中浅拷贝和深拷贝有什么区别,分别如何实现

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

我来回答

1个回答

热心网友 时间:2022-04-20 13:06

您好,
浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实现的都是浅拷贝,引用类型对象之间的赋值,就是复制一个对象引用地址的副本,而指向的对象实例仍然是同一个。
深拷贝:指对象的子段被拷贝,同时字段引用的对象也进行了拷贝。深拷贝创建的是整个源对象的结构,拷贝对象和原对象相互独立,不共享任何实例数据,修改一个对象不会影响到另一个对象。值类型之间的赋值操作,执行的就是深拷贝。
基本概念之参考代码:
代码如下:
class Program
{
static void Main(string[] args)
{
Student s1 = new Student("li", 23);

//浅拷贝
Student s2 = s1;
s2.Age = 27;
s1.ShowInfo();//li's age is 27

//深拷贝
int i = 12;
int j = i;
j = 22;
Console.WriteLine(i);//12

Console.Read();
}
}

class Student
{
public string Name;
public int Age;

public Student(string name, int age)
{
Name = name;
Age = age;
}

public void ShowInfo()
{
Console.WriteLine("{0}'s age is {1}", Name, Age);
}
}
分析:
在上例中,实例s2对s1进行了浅拷贝,对s2中的Age字段进行更改,继而影响实例s1中的Age字段。
深拷贝中,仅仅是值类型间简单的赋值,对“j”做出的更改不会更改“i”的值。
深浅拷贝的实现:
代码如下:
public object Clone()
{
return this.MemberwiseClone();
}
MemberwiseClone:创建一个浅表副本。过程是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用对象。
代码如下:
class Program
{
static void Main(string[] args)
{
ClassA ca = new ClassA();
ca.value = 88;
ClassA ca2 = new ClassA();
ca2 = (ClassA)ca.Clone();
ca2.value = 99;
Console.WriteLine(ca.value + "-----" + ca2.value);//88---99

ClassB cb = new ClassB();
cb.Member.value = 13;

ClassB cb2 = (ClassB)cb.Clone();
cb2.Member.value = 7;
Console.WriteLine(cb.Member.value.ToString() + "------" + cb2.Member.value.ToString());//浅拷贝:7---7 深拷贝:13----7

Console.Read();
}
}

public class ClassA : ICloneable
{
public int value = 0;

public object Clone()
{
return this.MemberwiseClone();
}
}

public class ClassB : ICloneable
{
public ClassA Member = new ClassA();

public object Clone()
{
//浅拷贝
return this.MemberwiseClone();

//深拷贝
ClassB obj = new ClassB();
obj.Member = (ClassA)Member.Clone();
return obj;
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在RLC电路中,谐振频率为___同期为___谐振条件为___? 电磁振荡并联 RLC振荡回路的谐振频率与振荡特性 佛手柑水培还是干放 中山市美派电器有限公司怎么样? 成都美派电器有限公司怎么样? 两条不同品牌的DDR3内存条可以一起用吗 驾驶证的牡丹卡多长时间能办下来 新衣服必须用洗衣液洗才能去甲醛吗? 梦见逛街被偷抢 2024年买什么品牌的运动男鞋比较好? python的复制,深拷贝和浅拷贝的区别 转:C#之深拷贝和浅拷贝的区别 深拷贝和浅拷贝怎样理解(通俗具体点儿) 淘宝上出售的那些OFFICE 2010 的注册码是怎么得到的?高分!!! 淘宝上买的office2016激活码安全么 淘宝office激活码后缀 淘宝有很多卖office 密匙的,直接可以联网激活,请问他们都是通过什么方式弄来的?知道内幕的说一 淘宝上几块钱的office激活密钥靠谱吗 在淘宝上买office365激活码安全吗 淘宝网上的office密钥能用的住吗 怎么激活office?产品密钥 怎样在淘宝上买Office 2016 激活码? 我在网上买的office2016的密钥怎么用不了??怎么回事 买电脑送的office密钥在哪 淘宝上卖office密钥的人从哪里来的密钥 淘宝上卖的office激活码可信吗 淘宝上几块钱的office激活密钥靠谱吗?? 电脑没有安装微软Office系列软件,只买了个密钥,怎么安装? 淘宝上的office激活码怎么用 淘宝上买的office密钥靠谱吗,会不会存在和365一样泄密的隐患? Python中的赋值,浅拷贝和深拷贝的区别 C#对象的浅拷贝(浅表复制)和深拷贝(深度复制)是什么意思? 怎么跳过吃鸡人脸识别? 菜鸡软件如何跳过实名认证,直接玩游戏? 如何不让吃鸡写姓名和身份证才进入游戏? 吃鸡如何跳过游戏人脸验证环节? 吃鸡实名认证怎么解除未成年呢? 吃鸡可以不用实民认证 可以加速绝地求生国际服的加速器不用实名 apple watch可以脱离iPhone单独使用吗? 如果捡到一箱金条,怎么处理好 捡到金子回倒霉吗?怎么样化解啊? 黄金吊坠掉了两三个月又捡回来了好不好 捡到黄金是什么预兆? 我在山上捡到很多黄金银子该怎么办。会被关进大牢里面吗? 河里捡到的黄金怎么处理有相关的法律知识? 捡到黄金代表什么运势 捡到黄金首饰运气好不好? 突然捡到一斤黄金,咋处理! 捡到黄金戒指是什么预兆