.net中的深拷贝与浅拷贝
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> <span style="font-size: 10pt; color: blue; font-family: Consolas">public<span style="font-size: 10pt; color: blue; font-family: Consolas">override<span style="font-size: 10pt; color: #2b91af; font-family: Consolas">Enemy<span style="font-size: 10pt; font-family: Consolas"> Clone(<span style="font-size: 10pt; color: blue; font-family: Consolas">bool<span style="font-size: 10pt; font-family: Consolas"> isDeepCopy) <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> { <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> <span style="font-size: 10pt; color: #2b91af; font-family: Consolas">FootMan<span style="font-size: 10pt; font-family: Consolas"> footman; <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> <span style="font-size: 10pt; color: blue; font-family: Consolas">if<span style="font-size: 10pt; font-family: Consolas"> (isDeepCopy) <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> { <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> <span style="font-size: 10pt; color: #2b91af; font-family: Consolas">MemoryStream<span style="font-size: 10pt; font-family: Consolas"> memoryStream = <span style="font-size: 10pt; color: blue; font-family: Consolas">new<span style="font-size: 10pt; color: #2b91af; font-family: Consolas">MemoryStream<span style="font-size: 10pt; font-family: Consolas">(); <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> <span style="font-size: 10pt; color: #2b91af; font-family: Consolas">BinaryFormatter<span style="font-size: 10pt; font-family: Consolas"> formatter = <span style="font-size: 10pt; color: blue; font-family: Consolas">new<span style="font-size: 10pt; color: #2b91af; font-family: Consolas">BinaryFormatter<span style="font-size: 10pt; font-family: Consolas">(); <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> formatter.Serialize(memoryStream,<span style="font-size: 10pt; color: blue; font-family: Consolas">this<span style="font-size: 10pt; font-family: Consolas">); <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> memoryStream.Position = 0; <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> footman = (<span style="font-size: 10pt; color: #2b91af; font-family: Consolas">FootMan<span style="font-size: 10pt; font-family: Consolas">)formatter.Deserialize(memoryStream); <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> } <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> <span style="font-size: 10pt; color: blue; font-family: Consolas">else <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> footman = (<span style="font-size: 10pt; color: #2b91af; font-family: Consolas">FootMan<span style="font-size: 10pt; font-family: Consolas">)<span style="font-size: 10pt; color: blue; font-family: Consolas">this<span style="font-size: 10pt; font-family: Consolas">.MemberwiseClone(); <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> <span style="font-size: 10pt; color: blue; font-family: Consolas">return<span style="font-size: 10pt; font-family: Consolas"> footman; <p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Consolas"> } 说明:<span lang="EN-US" style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">Clone()<span style="font-family: 微软雅黑; mso-bidi-font-size: 10.5pt">方法接受一个参数,表示是否是深拷贝。在这里,我们通过序列化反序列化实现深拷贝,深拷贝实现对象的完整复制,包括对象内部的引用类型都会复制一份全新的。在这里,如果<span lang="EN-US">3个敌人对象的<span lang="EN-US">Location都指向内存同一个地址的话,那么它们就分不开了,因此,在复制的时候需要进行深拷贝,使得它们的<span lang="EN-US">Location是独立的。由于进行了深拷贝,修改了一个敌人的位置并不会影响其它敌人。 (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何为ASP.NET身份设置密码规则?
- asp.net-mvc – 我如何可以渲染局部视图在asp.net mvc 3
- asp.net – 如何访问Global.asax静态成员?
- asp.net-mvc – ASP.NET MVC路由和静态数据(即图像,脚本等)
- asp.net-mvc – 如何将ASP.Net MVC路径段中的1或0映射到布尔
- asp.net-mvc – Asp.net 5(vnext)是否可以使用?
- asp.net – 菜单控件生成的js导致Web窗体中的Sys未定义的异
- asp.net – 如何MSDeploy构建的网站包到一个处女IIS网站
- ASP.NET Response.Cache.SetNoStore()与Response.Cache.Set
- asp.net-mvc – 如何在扩展方法中使用HTML帮助器方法?
- asp.net-mvc-3 – MVC模型范围验证器?
- asp.net – .Net Core 2 Spa模板与角度材料
- asp.net-mvc – Azure git部署 – 第二个程序集中
- asp.net-mvc – 奇怪的错误w / NinjectValidator
- WPF中ComboBox绑定数据库自动读取产生数据
- asp.net – App Settings和connectionStrings配置
- asp.net – Tridion分析和个性化错误:用户不能为
- asp.net-mvc-3 – 为什么@ Html.Label()删除一些
- asp.net – 以纯文本识别URL
- ASP.NET微信公众号用于给指定OpenId用户发送红包