System.Array.CopyTo()和System.Array.Clone()之间的区别

Mis*_*Dev 74 .net c# arrays .net-2.0

System.Array.CopyTo()和之间有什么区别System.Array.Clone()

Pat*_*ins 52

克隆()方法返回一个新的数组包含原始阵列中的所有元件(浅表副本)对象.所述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.
Run Code Online (Sandbox Code Playgroud) 编辑:

删除错误的示例.

  • 你的例子是错的.在第一个中,`numbersCopy`只是对分配给`numbers`的数组的另一个引用.这与使用`CopyTo()`方法不同*.如果使用`CopyTo()`,您将得到与`Clone()`示例相同的结果.另外,这是C# - `System.out.println`应该是`Console.WriteLine`. (6认同)
  • 这个答案,误导**,正如其他人所说的那样是来自这里的复制粘贴:http://geekswithblogs.net/dforhan/archive/2005/12/01/61852.aspx (6认同)

Mic*_*urr 25

到目前为止没有提到的另一个区别是

  • Clone()目标阵列,因为一个新的从头开始创建不必还不存在.
  • CopyTo()不仅目标阵列需要已经存在,它需要足够大,以容纳从您指定为目标的索引源阵列中的所有元素.


Fly*_*wat 21

正如@PatrickDesjardins所说,两者都执行浅拷贝(尽管有许多误导的灵魂认为这CopyTo是深刻的复制).

但是,CopyTo允许您将一个数组复制到目标数组中的指定索引,从而为其提供更大的灵活性.


Joã*_*elo 19

如许多其他答案中所述,两种方法都执行阵列的浅拷贝.但是,有些差异和建议尚未解决,并在以下列表中突出显示.

特点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异常,则抛出).
  • 允许将源复制到长度大于源的目标阵列.

还要注意,这些方法提供支持ICloneableICollection,因此,如果你正在处理,你不应该使用数组类型的变量CloneCopyTo转而使用Array.CopyArray.ConstrainedCopy.受约束的副本确保如果复制操作无法完成,则目标阵列状态不会被破坏.


Gen*_*Ziy 7

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"
Run Code Online (Sandbox Code Playgroud)

来源

  • 如果您放入数组中的类型是原始/不可变的,则浅复制或深复制是_无关紧要的_。当字符串和整数被放入其他内容时,_总是_会生成一个新的副本。要测试深度复制,请将一个复杂的对象(如数组)放在其中一个位置上。 (2认同)