当前位置: 首页 > news >正文

青田县住房和城乡规划建设局网站/企业管理培训

青田县住房和城乡规划建设局网站,企业管理培训,做公司网站 哪个程序用的多,制作视频模板MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此…

MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

为了实现深度复制,我们就必须遍历有相互引用的对象构成的图,并需要处理其中的循环引用结构。这无疑是十分复杂的。幸好借助.Net的序列化和反序列化机制,可以十分简单的深度Clone一个对象。原理很简单,首先将对象序列化到内存流中,此时对象和对象引用的所用对象的状态都被保存到内存中。.Net的序列化机制会自动处理循环引用的情况。然后将内存流中的状态信息反序列化到一个新的对象中。这样一个对象的深度复制就完成了。在原型设计模式中CLONE技术非常关键。

下面的代码就是演示这个问题:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;namespace CloneDemo
{[Serializable]class DemoClass{public int i = 0;public int[] iArr = { 1, 2, 3 };public DemoClass Clone1() //浅CLONE{return this.MemberwiseClone() as DemoClass;}public DemoClass Clone2() //深clone{MemoryStream stream = new MemoryStream();BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(stream, this);stream.Position = 0;return formatter.Deserialize(stream) as DemoClass;}}class Program{static void Main(string[] args){DemoClass a = new DemoClass();a.i = 10;a.iArr = new int[] { 8, 9, 10 };DemoClass b = a.Clone1();DemoClass c = a.Clone2();// 更改 a 对象的iArr[0], 导致 b 对象的iArr[0] 也发生了变化 而 c不会变化a.iArr[0] = 88;Console.WriteLine("MemberwiseClone");Console.WriteLine(b.i);foreach (var item in b.iArr){Console.WriteLine(item);}Console.WriteLine("Clone2");Console.WriteLine(c.i);foreach (var item in c.iArr){Console.WriteLine(item);}Console.ReadLine();}}
}
另外一个例子是针对数组,C#中的数组是引用型的变量,我们通过数组来进行演示:

浅拷贝:

None.gifusing System;
None.gif
None.gifclass ShallowCopy : ICloneable
ExpandedBlockStart.gif{
ExpandedSubBlockStart.gif public int[] v = {1,2,3};
InBlock.gif
InBlock.gif public Object Clone()
ExpandedSubBlockStart.gif {
InBlock.gif return this.MemberwiseClone();
ExpandedSubBlockEnd.gif  }
InBlock.gif
InBlock.gif public void Display()
ExpandedSubBlockStart.gif {
InBlock.gif foreach(int i in v)
InBlock.gif      Console.Write( i + ", ");
InBlock.gif    Console.WriteLine();
ExpandedSubBlockEnd.gif  }
ExpandedBlockEnd.gif}
None.gif
None.gifclass Client
ExpandedBlockStart.gif{
InBlock.gif public static void Main()
ExpandedSubBlockStart.gif {
InBlock.gif    ShallowCopy sc1 = new ShallowCopy();
InBlock.gif    ShallowCopy sc2 = (ShallowCopy)sc1.Clone();
InBlock.gif    sc1.v[0] = 9;
InBlock.gif
InBlock.gif    sc1.Display();
InBlock.gif    sc2.Display();
ExpandedSubBlockEnd.gif  }
ExpandedBlockEnd.gif}

ShallowCopy对象实现了一个浅拷贝,因此当对sc1进行克隆时,其字段v并没有克隆,这导致sc1与sc2的字段v都指向了同一个v,因此,当修改了sc1的v[0]后,sc2的v[0]也发生了变化。

深拷贝:

None.gifusing System;
None.gif
None.gifclass DeepCopy : ICloneable
ExpandedBlockStart.gif{
ExpandedSubBlockStart.gif public int[] v = {1,2,3};
InBlock.gif
InBlock.gif // 默认构造函数
InBlock.gif public DeepCopy()
ExpandedSubBlockStart.gif {
ExpandedSubBlockEnd.gif  }
InBlock.gif
InBlock.gif // 供Clone方法调用的私有构造函数
InBlock.gif private DeepCopy(int[] v)
ExpandedSubBlockStart.gif {
InBlock.gif this.v = (int[])v.Clone();
ExpandedSubBlockEnd.gif  }
InBlock.gif
InBlock.gif public Object Clone()
ExpandedSubBlockStart.gif {
InBlock.gif // 构造一个新的DeepCopy对象,构造参数为
InBlock.gif // 原有对象中使用的 v
InBlock.gif return new DeepCopy(this.v);
ExpandedSubBlockEnd.gif  }
InBlock.gif
InBlock.gif public void Display()
ExpandedSubBlockStart.gif {
InBlock.gif foreach(int i in v)
InBlock.gif      Console.Write( i + ", ");
InBlock.gif    Console.WriteLine();
ExpandedSubBlockEnd.gif  }
ExpandedBlockEnd.gif}
None.gif
None.gifclass Client
ExpandedBlockStart.gif{
InBlock.gif public static void Main()
ExpandedSubBlockStart.gif {
InBlock.gif    DeepCopy dc1 = new DeepCopy();
InBlock.gif    DeepCopy dc2 = (DeepCopy)dc1.Clone();
InBlock.gif    dc1.v[0] = 9;
InBlock.gif
InBlock.gif    dc1.Display();
InBlock.gif    dc2.Display();
ExpandedSubBlockEnd.gif  }
ExpandedBlockEnd.gif}

这次在克隆的时候,不但克隆对象本身,连里面的数组字段一并克隆。因此,最终打印出来的dc1与dc2不同。

当然我们也可以建个深拷贝的帮助类:

public static class ObjectCopier
{
    /// <summary>
    /// Perform a deep Copy of the object.
    /// </summary>
    /// <typeparam name="T">The type of object being copied.</typeparam>
    /// <param name="source">The object instance to copy.</param>
    /// <returns>The copied object.</returns>
    public static T Clone<T>(T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        // Don't serialize a null object, simply return the default for that object
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}   

转载于:https://www.cnblogs.com/zhaojin/archive/2012/03/22/2411299.html

http://www.lbrq.cn/news/1453429.html

相关文章:

  • 网站 被 抄袭/seo域名如何优化
  • 什么是html5网站/竞价托管代运营公司
  • 自己做的网站套dedecms教程/国家反诈中心app下载
  • 网站手机pc同步/广州网站快速优化排名
  • python web/百度网站排名关键词整站优化
  • 做网站责任/济南头条新闻热点
  • 网站建设找实体还是淘宝/附近的电脑培训班在哪里
  • 网站建设中广告图片尺寸/网站推广的概念
  • 长治企业网站建设价格/百度识图搜索网页版
  • 石湾网站制作/在线代理浏览网站
  • 周口规划建设局网站/网络推广方法有哪几种
  • 上海 网站制作/百度人工申诉客服电话
  • 地铁建设优缺点/兰州seo培训
  • 自己如何高效有力的维护一个网站/长沙网络推广网站制作
  • 西安做网站哪家好/中国十大电商平台排名
  • 个人建设网站需要什么证件吗/东莞关键词排名快速优化
  • 茶山东莞网站建设/网站cms
  • 杭州外贸公司/seo模拟点击有用吗
  • shopify做全品类网站/全网营销推广怎么做
  • 专注集团网站建设/手机网站建设公司
  • 企业网站帮助中心/百度一下就知道百度首页
  • 企业定制网站建设公司哪家好/建网站的软件
  • 营销型网站策划建设分为哪几个层次/友情链接的定义
  • 从零开始做网站/目前病毒的最新情况
  • 常州外贸网站设计/桂平网络推广
  • 今日新开网站/seo如何进行优化
  • 凡科是免费做网站吗/seo引擎优化外包
  • 外贸网站建设seo/免费s站推广网站
  • vultr建站wordpress/教育培训机构前十名
  • 私人网站建设步骤/品牌关键词排名优化怎么做
  • JavaScript 中的流程控制语句详解
  • SQL注入SQLi-LABS 靶场less39-50详细通关攻略
  • ref和reactive的区别
  • 深入剖析RT-Thread串口驱动:基于STM32H750的FinSH Shell全链路Trace分析与实战解密(上)
  • Petalinux快捷下载
  • TCP 协议的“无消息边界”(No Message Boundaries)特性