C#中如何对数组进行深复制
2011-03-05 10:38
381 查看
在复习C#的一些基本知识点,看到数组这节时想到对进行数组进行复制这问题,然后发现.Net Framework中没有提供对深复制的原生API支持,参考了书的提示,发现可以用“序列化/反序列化”来实现对数组的深复制。
首先分别什么是浅复制以及深复制:
除了对数组进行浅复制和深复制,其他Object对象也可以进行浅复制和深复制,这里讨论数组的深复制,也是解决其他对象深复制的思路之一。
对数组执行浅复制有两种方法,一种是使用CopyTo,另一种是使用Clone,这两个方法都属于实例方法,其中Clone方法继承System.Object对象,返回一个新的对象,不过需要显式类型转换。CopyTo方法可以将一个一维数组的所有元素复制到一个已有的数组实例,这是与Clone方法之间的一个重要区别。
对数组进行浅复制比较容易理解,下面讨论下用“序列化/反序列化”的方式实现对数组的深复制。
下面是网上对序列化及反序列化的介绍:C#序列化和反序列化,两者的程序处理方式基本一致,都是基于工厂模式的,所谓C#序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件中。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。相反的,反序列化根据流重新构造对象。.NET自带的有两种序列化对象的方式,Xml和binary的,XML 序列化不转换方法、索引器、私有字段或只读属性(只读集合除外)。要序列化对象的所有字段和属性(公共的和私有的),请使用 BinaryFormatter,而不要使用 XML 序列化。
然后还有遍感觉挺详细的博文:/article/4797294.html
用序列化/反序列化实现对数组的深复制代码如下:
View Code
首先分别什么是浅复制以及深复制:
浅复制:将原来对象中的所有字段逐个复制到一个新对象,如果字段是值类型,刚只是简单地复制一个副本到新对象,改变新对象的值类型字段不会影响原对象,如果字段是引用类型,则复制的是引用,改变目标对象中引用类型字段的值将会影响原对象。 深复制:与浅复制不同之处在于对引用类型的处理,深复制将会在新对象中创建引用类型字段引用的所有对象,改变新对象中引用的任何对象,不会影响到原来的对象中对应字段的内容。
除了对数组进行浅复制和深复制,其他Object对象也可以进行浅复制和深复制,这里讨论数组的深复制,也是解决其他对象深复制的思路之一。
对数组执行浅复制有两种方法,一种是使用CopyTo,另一种是使用Clone,这两个方法都属于实例方法,其中Clone方法继承System.Object对象,返回一个新的对象,不过需要显式类型转换。CopyTo方法可以将一个一维数组的所有元素复制到一个已有的数组实例,这是与Clone方法之间的一个重要区别。
对数组进行浅复制比较容易理解,下面讨论下用“序列化/反序列化”的方式实现对数组的深复制。
下面是网上对序列化及反序列化的介绍:C#序列化和反序列化,两者的程序处理方式基本一致,都是基于工厂模式的,所谓C#序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件中。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或者和其它应用程序共享使用。相反的,反序列化根据流重新构造对象。.NET自带的有两种序列化对象的方式,Xml和binary的,XML 序列化不转换方法、索引器、私有字段或只读属性(只读集合除外)。要序列化对象的所有字段和属性(公共的和私有的),请使用 BinaryFormatter,而不要使用 XML 序列化。
然后还有遍感觉挺详细的博文:/article/4797294.html
用序列化/反序列化实现对数组的深复制代码如下:
View Code
using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace ArraySample { [Serializable] //标识Number类为可序列化 class Number { public int Num{get;set;} public override string ToString() { return string.Format("数值为:{0}",Num); } } class CopySample { public static void PrintArray(Number [] Numbers) { foreach(Number number in Numbers) { Console.WriteLine(number); } Console.WriteLine(); } public static void Main(string[] args) { Number[] array1 = new Number[4]; int[] array2 = new int[4]{1,2,3,4}; for(int i=0;i<array1.Length;i++) { array1[i] = new Number{Num = 10 *(i+1)}; } Console.WriteLine("数组array1的元素:"); PrintArray(array1); MemoryStream ms = new MemoryStream();//序列化 BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(ms,array1); ms.Position = 0; Number[] array3 = (Number[])bf.Deserialize(ms); //反序列化 for(int i = 0;i<array3.Length;i++) { array3[i].Num=20 *(i+1); } Console.WriteLine("对数组array3进行重新赋值后array3的元素:"); PrintArray(array3); Console.WriteLine("对数组array3进行重新赋值后array1的元素:"); PrintArray(array1); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } }
相关文章推荐
- 如何进行object以及Array(数组)的深复制
- 如何在c#程序中模拟域帐户进行登录操作
- 如何在Visual Studio C#.Net WinForm 中 TreeView中右键选择节点进行处理?
- c# 如何将字符串中用","分开的数字分别存入数组中
- 如何利用C#代码来进行操作AD
- 想自己用C#写程序,主要功能是对其他的程序进行打包,如何实现,求高手指教!!!
- C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改
- .NET :如何对数组进行排序
- C# 如何通过委托进行窗体1到窗体2的传值
- Active Directory如何用C#进行增加、删除、修改、查询用户与组织单位(转)
- C#.NET 对HashTable数组进行按值排序
- C# Dictionary进行值复制,而不是地址复制的方法
- c#里如何实现控件数组
- 如何使用C#进行Visio二次开发
- Access数据库教程_如何进行C#连接Access数据库的细节操作?
- asp.net(c#)如何把字符串转换成数组
- C# 常见的字节数组 byte[] 复制方法
- C# 一个长度为100的int数组,插入1-100的随机数,不能重复,如何写
- js:数组重排序问题:如何使用sort()方法按数值的大小进行升序或降序排列
- C# 数组的复制