System.Array.CopyTo()
和之间有什么区别System.Array.Clone()
?
该克隆()方法返回一个新的数组包含原始阵列中的所有元件(浅表副本)对象.所述CopyTo从()方法复制的元素到另一个现有阵列.两者都执行浅拷贝.浅拷贝意味着内容(每个数组元素)包含与原始数组中的元素相同的对象的引用.深层副本(这些方法都不执行)将为每个元素的对象创建一个新实例,从而产生一个不同但相同的对象.
所以区别在于:
1- CopyTo require to have a destination array when Clone return a new array. 2- CopyTo let you specify an index (if required) to the destination array.编辑:
删除错误的示例.
到目前为止没有提到的另一个区别是
与Clone()
目标阵列,因为一个新的从头开始创建不必还不存在.
与CopyTo()
不仅目标阵列需要已经存在,它需要足够大,以容纳从您指定为目标的索引源阵列中的所有元素.
正如@PatrickDesjardins所说,两者都执行浅拷贝(尽管有许多误导的灵魂认为这CopyTo
是深刻的复制).
但是,CopyTo
允许您将一个数组复制到目标数组中的指定索引,从而为其提供更大的灵活性.
如许多其他答案中所述,两种方法都执行阵列的浅拷贝.但是,有些差异和建议尚未解决,并在以下列表中突出显示.
特点System.Array.Clone
:
使用.NET 4.0进行的测试显示它比CopyTo
可能因为它使用的速度慢Object.MemberwiseClone
;
需要将结果转换为适当的类型;
生成的数组与源的长度相同.
特点System.Array.CopyTo
:
比Clone
复制到相同类型的数组更快 ;
它调用Array.Copy
继承功能,是最有用的功能:
可以将值类型元素框值转换为引用类型元素,例如,将int[]
数组复制到object[]
;
可以将unbox引用类型元素转换为值类型元素,例如,将一个object[]
盒装数组复制int
到一个int[]
;
可以对值类型执行扩展转换,例如,将a复制int[]
到a long[]
.
可以向下转换元素,例如,将Stream[]
数组复制到一个MemoryStream[]
(如果源数组中的任何元素不能转换为MemoryStream
异常,则抛出).
允许将源复制到长度大于源的目标阵列.
还要注意,这些方法提供支持ICloneable
和ICollection
,因此,如果你正在处理,你不应该使用数组类型的变量Clone
或CopyTo
转而使用Array.Copy
或Array.ConstrainedCopy
.受约束的副本确保如果复制操作无法完成,则目标阵列状态不会被破坏.
object[] myarray = new object[] { "one", 2, "three", 4, "really big number", 2324573984927361 }; //create shallow copy by CopyTo //You have to instantiate your new array first object[] myarray2 = new object[myarray.Length]; //but then you can specify how many members of original array you would like to copy myarray.CopyTo(myarray2, 0); //create shallow copy by Clone object[] myarray1; //here you don't need to instantiate array, //but all elements of the original array will be copied myarray1 = myarray.Clone() as object[]; //if not sure that we create a shalow copy lets test it myarray[0] = 0; Console.WriteLine(myarray[0]);// print 0 Console.WriteLine(myarray1[0]);//print "one" Console.WriteLine(myarray2[0]);//print "one"
来源