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

产品通过网站做营销软件开发平台公司

产品通过网站做营销,软件开发平台公司,网站设计怎么验收,百度爱采购官网今天继续利用准备WSE安全开发文章的空闲时间#xff0c;完善《.NET深入学习笔记》系列#xff08;基本都是.Net重要的知识点#xff0c;我都做了详细的总结#xff0c;是什么、为什么、和怎么实现#xff09;。想必很多人也接触过这两个概念。做过C的人对深浅拷贝的概念一…今天继续利用准备WSE安全开发文章的空闲时间完善《.NET深入学习笔记》系列基本都是.Net重要的知识点我都做了详细的总结是什么、为什么、和怎么实现。想必很多人也接触过这两个概念。做过C的人对深浅拷贝的概念一定不会陌生。而其很多C#高级软件工程师的面试里也会问到深浅拷贝相关的问题。我今天就在总结一下并且添加了详细的代码实现与大家分享。一起学习一下C#的深拷贝与浅拷贝(Deep Copy and Shallow Copy)的机制。全文还是分四部分1.基本概念  2.深拷贝与浅拷贝实现机制 3.代码实现和分析 4.总结。下面我们来进入正式的学习。    1.基本概念        首先我们应该了解一下什么叫深拷贝与浅拷贝(Deep Copy and Shallow Copy)。       a.浅拷贝(Shallow Copy影子克隆)只复制对象的基本类型,对象类型,仍属于原来的引用。      b.深拷贝(Deep Copy 深度克隆)不紧复制对象的基本类,同时也复制原对象中的对象.完全产生新对象。       我们知道在C中有拷贝构造函数和拷贝赋值函数的概念。浅拷贝就是成员数据之间的一一赋值把值赋给一一赋给要拷贝的值。但是可能会有这样的情况对象还包含资源这里的资源可以指堆资源或者一个文件。当值拷贝的时候两个对象就有用共同的资源同时对资源可以访问这样就会出问题。深拷贝就是用来解决这样的问题的它把资源也赋值一次使对象拥有不同的资源但资源的内容是一样的。对于堆资源来说就是在开辟一片堆内存把原来的内容拷贝。      如果你拷贝的对象中引用了某个外部的内容比如分配在堆上的数据那么在拷贝这个对象的时候让新旧两个对象指向同一个外部的内容就是浅拷贝如果在拷贝这个对象的时候为新对象制作了外部对象的独立拷贝就是深拷贝     这个C#里的概念与C类似。我们可以参考以前的概念理解。 深拷贝与浅拷贝之间的区别基本可以从定义看出。首先浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象中引用型字段的值他将反映在原是对象中也就是说原始对象中对应的字段也会发生变化。     深拷贝与浅拷贝不同的是对于引用拷贝的处理深拷贝将会在新对象中创建和原是对象中对应值类型的字段并且赋值。浅拷贝不会创建新引用类型会返回相同的类型引用。深拷贝会重新创建新对象返回新对象的引用字。C#中的观察者模式就是浅拷贝的例子。我们保留的只是对象的副本。       2.深拷贝与浅拷贝实现机制       从上面的概念我们了解了C#深拷贝与浅拷贝(Deep Copy and Shallow Copy)的不同之处。这个也就决定了两者有不同的实现方式。      对于值类型    a.浅拷贝 通过赋值等操作直接实现将对象中的值类型的字段拷贝到新的对象中。          b.深拷贝通过赋值等操作直接实现将对象中的值类型的字段拷贝到新的对象中。   和浅拷贝相同     对于引用类型    a.浅拷贝 MemberwiseClone 方法创建一个浅副本方法是创建一个新对象如果字段是值类型的则对该字段执行逐位复制。如果字段是引用类型则复制引用原始对象与原对象引用同一对象。     b.深拷贝拷贝对象应用也拷贝对象实际内容也就是创建了一个新的改变新对象 不会影响到原始对象的内容  这种情况需要为其实现ICloneable接口中提供的Clone方法。    差别就是在对于引用类型的实现深拷贝和浅拷贝的时候的机制不同前者是MemberwiseClone 方法实现后者是通过继承实现ICloneable接口中提供的Clone方法实现对象的深拷贝。   3.代码实现和分析    下面我们来看看具体的代码实现部分首先介绍的还是值类型的。     a.值类型浅拷贝的实现。代码如下 /// summary        ///  数组的赋值(直接拷贝)也就是引用传递指向的是同一个地址        /// /summary        public void MethodShallowCopyDirectly()        {            int[] ArrayInt  { 0, 1, 2, 3 };            //所以改变其中任意一个变量的值另一个也会被改变            int[] NewArrayInt  ArrayInt;            //改变新的数组变量            NewArrayInt[0]  8;            Console.WriteLine(数组的复制(直接拷贝)改变新数组第一值为8原值{0},新值{1}, ArrayInt[0], NewArrayInt[0]);        }        /// summary        /// ArrayInt.CopyTo,创建以个新数组不影响原来的值        /// /summary        public void MethodShallowCopyArrayCopyTo()        {            int[] ArrayInt  { 0, 1, 2, 3 };                 //CopyTo()方法            int[] NewArrayInt  new int[5];//创建以个新数组按值拷贝不影响原来的值            ArrayInt.CopyTo(NewArrayInt, 0);            NewArrayInt[0]  8;            Console.WriteLine(Array.CopyTo改变新数组第一值为8原值{0},新值{1}, ArrayInt[0], NewArrayInt[0]);                }        /// summary        /// Array.Copy浅拷贝,值类型的浅拷贝,创建以个新数组按值拷贝不影响原来的值        /// /summary        public void MethodShallowCopyArrayCopy()        {            int[] ArrayInt  { 0, 1, 2, 3 };            //Copy()方法            int[] NewArrayInt  new int[4];            Array.Copy(ArrayInt, NewArrayInt, 0);//创建以个新数组按值拷贝不影响原来的值            NewArrayInt[0]  8;            Console.WriteLine(Array.Copy改变新数组第一值为8原值{0},新值{1}, ArrayInt[0], NewArrayInt[0]);        }        /// summary        /// Array.Clone()浅拷贝        /// /summary        public void MethodShallowCopyArrayClone()        {            int[] ArrayInt  { 0, 1, 2, 3 };            //Array Clone()方法            int[] NewArrayInt  ArrayInt.Clone() as int[];//按值拷贝不影响原来的值            NewArrayInt[0]  8;            Console.WriteLine(Array.Clone()改变新数组第一值为8原值{0},新值{1}, ArrayInt[0], NewArrayInt[0]);        }        /// summary        /// .浅拷贝(引用类型)数组中的元素是引用类型复制的是它的一个引用改变新拷贝会改变原对象        /// /summary        public void MethodShallowCopyStringArrayCopyTo()        {            string[] sArray { string0, string1, string2 };            string[] sNewArray  sArray;            //浅拷贝一个新对象            sArray.CopyTo(sNewArray, 0);            //改变新对象的值这个时候源对象中的值也会被改变            sNewArray[0]  FrankXuLei;            Console.WriteLine(数组的浅拷贝(引用类型)改变第一值为FrankXuLei原值{0},新值{1}, sArray[0], sNewArray[0]);        }        /// summary        ///  //字符串数组的深拷贝如果需要包含引用类型的数组的深副本就必须迭代数组创建新对象        /// /summary        public void MethodDeepCopyStringArray()        {            string[] sArray  new string[] { string0, string1, string2, string3 };            string[] sNewArray  new string[4];//迭代数组创建新对象            for (int i  0; i  sArray.Length; i)            {                string sTemp  string.Empty;                sTemp  sArray[i];                sNewArray[i]  sTemp;            }            sNewArray[0]  FrankXuLei;            Console.WriteLine(数组的复制(直接拷贝)改变新数组第一值为FrankXuLei原值{0},新值{1}, sArray[0], sNewArray[0]);        }        数组的赋值(直接拷贝)也就是引用传递指向的是同一个地址 所以改变其中任意一个变量的值另一个也会被改变。ArrayInt.CopyTo,创建以个新数组改变新的数组变量不影响原来的值。Array.Copy浅拷贝,值类型的浅拷贝,创建以个新数组按值拷贝不影响原来的值。 .浅拷贝(引用类型)数组中的元素是引用类型复制的是它的一个引用改变新拷贝会改变原对象.    b.引用类型的深拷贝实现     定义了以个汽车类,继承接口继承接口ICloneable。   public class CarDeepClone : ICloneable    {        //名称引用类型        public string _name  string.Empty;        //价格值得类型        public int _price  0;        //构造函数        public CarDeepClone()        {        }        //重载构造函数        public  CarDeepClone(string name, int price)        {            _name  name;            _price  price;        }        //深拷贝需要重新生成对象返回的新对象的实例        public object Clone()        {            //深复制              CarDeepClone obj  new CarDeepClone();//重新创建 CarDeepClone的对象            //obj.Member   (ClassA)Member.Clone();              return obj;        }    }    c.引用类型的浅拷贝实现    浅拷贝实现的方法是this.MemberwiseClone();创建当前对象的浅副本 返回相同的对象引用。而深拷贝的实现代码是通过 CarDeepClone obj new CarDeepClone();重新创建 CarDeepClone的对象。这个是两者在实现上不同的地方。 public class CarShallowClone : ICloneable    {        //名称引用类型        public string _name  string.Empty;        //价格值得类型        public int _price  0;        //构造函数        public  CarShallowClone(string name, int price)        {            _name  name;            _price  price;        }        //浅拷贝MemberwiseClone方式返回对象的浅副本        public object Clone()        {            return this.MemberwiseClone();//创建当前对象的浅副本 返回相同的对象引用        }    }    d.客户端测试代码实现     包括值类型的浅拷贝和string类型数组的深拷贝的实现测试。以及对象的深拷贝和浅拷贝的测试。具体代码如下 ValueTypeCopy _ShallowCopy  new ValueTypeCopy();            Console.WriteLine(Value Type Shallow Copy Demo 值类型浅拷贝。。。。。。。。。。。。。。。。。。);            _ShallowCopy.MethodShallowCopyDirectly();//直接赋值            _ShallowCopy.MethodShallowCopyArrayClone();//调用数组的Clone()方法浅副本            _ShallowCopy.MethodShallowCopyArrayCopy();//ArrayCopy方法            _ShallowCopy.MethodShallowCopyArrayCopyTo();//ArrayCopyTo()方法            _ShallowCopy.MethodShallowCopyStringArrayCopyTo();//ArrayCopyTo()方法             _ShallowCopy.MethodDeepCopyStringArray();//深拷贝字符数组             //DeepCopy Test深拷贝重新生成对象对新对象的修改不会改变原来对象的值            Console.WriteLine(Object Deep    Copy Demo  对象深拷贝。。。。。。。。。。。。。。。。。。。。。);            CarDeepClone _CarDeepClone1  new CarDeepClone(Benz700,700);            //深拷贝            Console.WriteLine(DeepCopy Test深拷贝,原对象名字{0}, _CarDeepClone1._name);            CarDeepClone _CarDeepClone2  _CarDeepClone1.Clone() as CarDeepClone;            Console.WriteLine(DeepCopy Test深拷贝,新对象名字{0}, _CarDeepClone2._name);            //修改新对象的名字            _CarDeepClone2._name  Benz800;            Console.WriteLine(DeepCopy Test深拷贝,新对象名字修改为{0}, _CarDeepClone2._name);            //输出对象信息            Console.WriteLine(DeepCopy Test深拷贝,原对象名字为{0}新对象名字为{1}, _CarDeepClone1._name, _CarDeepClone2._name);            //ShallowCopy Test浅拷贝新对象的修改会改变原来对象的值得            Console.WriteLine(Object Shallow Copy Demo  对象浅拷贝。。。。。。。。。。。。。。。。。。。。。);            CarShallowClone _CarShallowClone1  new CarShallowClone(BMW3, 300);            Console.WriteLine(ShallowCopy Test浅拷贝,原对象名字{0}, _CarShallowClone1._name);            //浅拷贝对象            CarShallowClone _CarShallowClone2  _CarShallowClone1.Clone() as CarShallowClone;            Console.WriteLine(ShallowCopy Test浅拷贝,新对象名字{0}, _CarShallowClone2._name);            //修改新对象名字            _CarShallowClone2._name  BMW7;            Console.WriteLine(ShallowCopy Test浅拷贝,新对象名字修改为{0}, _CarShallowClone2._name);            //输出对象信息            Console.WriteLine(ShallowCopy Test浅拷贝,原对象名字{0}新对象名字{1}, _CarShallowClone1._name, _CarShallowClone2._name);                        首先测试的值类型的不同的浅拷贝方法实例化类ValueTypeCopy _ShallowCopy new ValueTypeCopy();    进行 值类型浅拷测试贝。分别包括   _ShallowCopy.MethodShallowCopyDirectly();直接赋值拷贝            _ShallowCopy.MethodShallowCopyArrayClone();调用数组的Clone()方法浅副本            _ShallowCopy.MethodShallowCopyArrayCopy();ArrayCopy方法            _ShallowCopy.MethodShallowCopyArrayCopyTo();ArrayCopyTo()方法            _ShallowCopy.MethodShallowCopyStringArrayCopyTo();ArrayCopyTo()方法             _ShallowCopy.MethodDeepCopyStringArray();深拷贝字符数组后面代码主要是对对象深浅拷贝的不同测试。 运行结果如下图   4.总结      通过以上内容的学习希望大家对C#中的深拷贝与浅拷贝(Deep Copy and Shallow Copy)的机制能有更深入的了解。我在总结这个文章的时候也查阅了MSDN及C#书籍等资料。与大家一起分享。有问题的也可以留言一起交流~共同学习进步~最后附上本次实现的代码。下载地址 /Files/frank_xl/CloneDemoFrankXuLei.zip 。前几天忙硕士论文的事情没时间更新blog现在抓紧时间继续准备WSE3.0安全开发的文章应该最近会写出来。主要是涉及到的知识点很多需要时间学习而且开发环境配置比较复杂。代码插入出了问题有js错误请大家下载代码转载于:https://www.cnblogs.com/jiangj/archive/2010/08/20/1804518.html
http://www.pierceye.com/news/735275/

相关文章:

  • 照片书那个网站做的好重庆网站建设价格费用
  • 网站两侧广告石家庄建设
  • 网站设计的企业网站建设教程txt
  • 大型建站公司seo查询5118
  • 百度站长提交工具中小企业建站模板
  • 企业网站西安seo服务
  • 做网站需要多少个人网站logo设计
  • 新浪云 建设网站中企动力双语网站
  • 网站建设中心网站开发前端工程师
  • 网站目录结构设计应注意的问题课程平台网站建设报价
  • 南京网站排名优化费用做网站大作业的心得体会
  • 网站 三合一高端的响应式网站建设公司
  • 网站设计公司天津网站备案不关站
  • 怎样增加网站会员量微信商城怎么进入
  • 网站建设目的功能行业门户网站源码
  • 建设网站收费标准100m做电影网站
  • 怎么样自己做最简单的网站wordpress酷黑主题
  • 长沙市建设网站网站修改域名
  • 邢台企业做网站价格如何做网络推广运营
  • 番禺网站建设服务百度广告推广价格
  • 什么系统做网站最安全网络科技网站设计
  • 通州网站建设是什么查看网站开发商
  • 建设网站公司浩森宇特怎么推广公司网站
  • 来宾住房和城乡建设网站变装第三性wordpress
  • 自己开发网站怎么开发站长工具网址是多少
  • 农业交易平台网站建设成都微信网站开发
  • 十大网站app软件网站建设企业的市场分析
  • 建设网站教程视频下载企业所得税税率2019
  • 网站图片上传不了是什么原因建筑施工图设计
  • 做网站必须要公网ip个人主页网页设计教程