本文深入浅出的分析了ASP.NET深度复制和浅度复制。分享给大家供大家参考。具体分析如下:
之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉。
如果大家不懂值类型和引用类型的区别,请先看https://www.jb51.net/article/57471.htm,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了。
大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为
我们可以通过这个方法来达到浅度复制的效果。
下面我们通过一个例子来阐述一下浅度复制,其与深度复制的区别在什么地方:
复制代码 代码如下:public class Content
{
public int Val;
}
public class Cloner
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
public object GetCopy()
{
return MemberwiseClone();
}
}
在这里我们有两个类,一个Content类,只有一个为值类型int的Val,还有个类是一个Cloner类,其有一个Content类型的成员,然后有个构造函数可以初始化成员,最后有一个GetCopy的方法,通过MemberwiseClone方法来复制自己。
下面我们通过一段代码来调用Cloner类:
复制代码 代码如下:static void Main(string[] args)
{
Cloner source = new Cloner(10);
Cloner target = (Cloner)source.GetCopy();//返回的是一个Object类型 需要做类型转换.
Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val);
source.MyContent.Val = 15;
Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val);
Console.ReadKey();
}
结果是:
我们可以看到我们通过GetCopy()函数复制类source给target,但是当我们改变source的时候,source输出的值也跟着改变。由此我们可以得出,我们通过MemberwiseClone()复制的只是引用,即source和target的MyContent是相同的对象实例。这就是浅度复制,那我们如何实现深度复制呢,在.NET Framework中,给我们提供了ICloneable接口。
首先我们看下ICloneable接口:
复制代码 代码如下:// 摘要:
// 支持克隆,即用与现有实例相同的值创建类的新实例。
[ComVisible(true)]
public interface ICloneable
{
// 摘要:
// 创建作为当前实例副本的新对象。
//
// 返回结果:
// 作为此实例副本的新对象。
object Clone();
}
在上面那个例子中,我们只需要修改一些代码就可以了:
复制代码 代码如下:public class Cloner:ICloneable
{
public Content MyContent = new Content();
public Cloner(int newVal)
{
MyContent.Val = newVal;
}
//public object GetCopy()
//{
// return MemberwiseClone();
//}
public object Clone()
{
Cloner cloned = new Cloner(MyContent.Val);
return cloned;
}
}
为了做区别我把之前的代码放在上面,注释了的代码就是浅度复制,后面的为深度复制,我们看到差别在于用本实例的MyContent.Val重新生成了实例返回给目标,测试结果为:
这里如果MyContent的成员不是一个值类型,那么我们还需要进行深度,像下面一样:
复制代码 代码如下:public object Clone()
{
Cloner cloned = new Cloner();
cloned.MyContent = MyContent.Clone();
return cloned;
}
深度复制和浅度复制就是这样,关键是创建一个新的对象实例返回去,而不是把原来的对象实例返回回去。
希望本文所述对大家的.NET程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。