System.Array.CopyTo() 和 System.Array.Clone() 之间的区别
System.Array.CopyTo()
和 System.Array.Clone()
之间有什么区别?
What’s the difference between the System.Array.CopyTo()
and System.Array.Clone()
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
Clone()方法返回一个新数组(浅拷贝)对象,其中包含原始数组中的所有元素。 CopyTo()方法将元素复制到另一个现有数组中。 两者都执行浅复制。 浅拷贝意味着内容(每个数组元素)包含对与原始数组中的元素相同的对象的引用。 深层复制(这两种方法都不执行)将创建每个元素对象的新实例,从而产生不同但相同的对象。
所以区别是:
Edit:
删除错误的例子。
The Clone() method returns a new array (a shallow copy) object containing all the elements in the original array. The CopyTo() method copies the elements into another existing array. Both perform a shallow copy. A shallow copy means the contents (each array element) contains references to the same object as the elements in the original array. A deep copy (which neither of these methods performs) would create a new instance of each element's object, resulting in a different, yet identical object.
So the difference are :
Edit:
Remove the wrong example.
到目前为止尚未提及的另一个区别是,
CopyTo()
不仅目标数组需要已经存在,而且它需要足够大以容纳源数组中您指定为目标的索引中的所有元素。One other difference not mentioned so far is that
Clone()
the destination array need not exist yet since a new one is created from scratch.CopyTo()
not only does the destination array need to already exist, it needs to be large enough to hold all the elements in the source array from the index you specify as the destination.正如许多其他答案中所述,两种方法都执行 数组的浅拷贝。 然而,还存在尚未解决的差异和建议,并在以下列表中突出显示。
System.Array.Clone
< 的特征/a>:CopyTo
慢,可能是因为它使用Object.MemberwiseClone
;System.Array.CopyTo
的特征:克隆
更快;Array.Copy
继承是能力,是最有用的:int[]
数组复制到object[]
中;int
的object[]
数组复制到int[]
;int[]
复制到long[]
。Stream[]
数组复制到MemoryStream[]
(如果源数组中的任何元素无法转换为MemoryStream
抛出异常)。另请注意,这些方法可用于支持
ICloneable
和ICollection
< /a>,因此,如果您正在处理数组类型的变量,则不应使用Clone
或CopyTo
,而应使用Array.Copy
或Array.ConstrainedCopy
。 受限复制可确保如果复制操作无法成功完成,则目标阵列状态不会损坏。As stated in many other answers both methods perform shallow copies of the array. However there are differences and recommendations that have not been addressed yet and that are highlighted in the following lists.
Characteristics of
System.Array.Clone
:CopyTo
probably because it usesObject.MemberwiseClone
;Characteristics of
System.Array.CopyTo
:Clone
when copying to array of same type;Array.Copy
inheriting is capabilities, being the most useful ones:int[]
array into anobject[]
;object[]
array of boxedint
into anint[]
;int[]
into along[]
.Stream[]
array into aMemoryStream[]
(if any element in source array is not convertible toMemoryStream
an exception is thrown).Also note, these methods are made available to support
ICloneable
andICollection
, so if you are dealing with variables of array types you should not useClone
orCopyTo
and instead useArray.Copy
orArray.ConstrainedCopy
. The constrained copy assures that if the copy operation cannot complete successful then the target array state is not corrupted.正如 @PatrickDesjardins 所说,两者都执行浅复制(尽管许多人被误导,认为 CopyTo 执行深复制)。
但是,
CopyTo
允许您将一个数组复制到目标数组中的指定索引,从而显着提高灵活性。Both perform shallow copies as @PatrickDesjardins said (despite the many misled souls who think that
CopyTo
does a deep copy).However,
CopyTo
allows you to copy one array to a specified index in the destination array, giving it significantly more flexibility.来源
the source
CopyTo() 和 Clone() 都进行浅复制。 Clone() 方法克隆原始数组。 它返回一个精确长度的数组。
另一方面,CopyTo() 将元素从原始数组复制到从指定目标数组索引开始的目标数组。 请注意,这会将元素添加到已经存在的数组中。
下面的代码将与说 CopyTo() 进行深层复制的帖子相矛盾:
让我解释一下。 如果数组的元素是引用类型,则复制(Clone() 和 CopyTo() )将被复制到第一(顶部)级别。 但较低级别不会被复制。 如果我们还需要较低级别的副本,我们必须明确地进行。 这就是为什么在克隆或复制引用类型元素之后,克隆或复制数组中的每个元素都引用与原始数组中相应元素引用的相同内存位置。 这清楚地表明没有为较低级别创建单独的实例。 如果是这样,那么更改复制或克隆数组中任何元素的值都不会影响原始数组的相应元素。
我认为我的解释很详尽,但我找不到其他方法可以使其理解。
Both CopyTo() and Clone() make shallow copy. Clone() method makes a clone of the original array. It returns an exact length array.
On the other hand, CopyTo() copies the elements from the original array to the destination array starting at the specified destination array index. Note that, this adds elements to an already existing array.
The following code will contradict the postings saying that CopyTo() makes a deep copy:
Let me explain it a bit. If the elements of the array are of reference types, then the copy (both for Clone() and CopyTo()) will be made upto the first(top) level. But the lower level doesn't get copied. If we need copy of lower level also, we have to do it explicitly. That's why after Cloning or Copying of reference type elements, each element in the Cloned or Copied array refers to the same memory location as referred by the corresponding element in the original array. This clearly indicates that no separate instance is created for lower level. And if it were so then changing the value of any element in the Copied or Cloned array would not have effect in the corresponding element of the original array.
I think that my explanation is exhaustive but I found no other way to make it understandable.
当将
int
数组或字符串传递给方法作为引用时,Array.Clone()
将执行技术上的深度复制。例如,
即使方法对数字数组进行排序,但它不会影响传递给排序方法的实际引用。即数字数组将在第 1 行中采用相同的未排序初始格式。
注意:克隆应该在排序方法中完成。
Array.Clone()
would perform technically deep copy, when pass the array ofint
or string to a method as a reference.For example
Even if the methods sort the array of numbers but it wont affect the actual reference passed to the sorting methods.i.e the number array will be in same unsorted initial format in line no 1.
Note: The Clone should be done in the sorting methods.
Clone()
方法不提供对目标实例的引用,只是给您一个副本。CopyTo()
方法将元素复制到现有实例中。两者都没有给出目标实例的引用,并且正如许多成员所说,他们给出了没有引用的浅复制(幻象复制),这是关键。
The
Clone()
method don't give reference to the target instance just give you a copy.the
CopyTo()
method copies the elements into an existing instance.Both don't give the reference of the target instance and as many members says they give shallow copy (illusion copy) without reference this is the key.
两者都是浅拷贝。 CopyTo 方法不是深层复制。
检查以下代码:
Both are shallow copies. CopyTo method is not a deep copy.
Check the following code :
调用函数时,Array.Clone 不需要目标/目标数组可用,而 Array.CopyTo 则需要目标数组和索引。
Array.Clone doesn't require a target/destination array to be available when calling the function, whereas Array.CopyTo requires a destination array and an index.
Clone()
用于仅复制数据/数组的结构,它不复制实际数据。CopyTo()
复制结构和实际数据。Clone()
is used to copy only structure of data/array it doesn't copy the actual data.CopyTo()
copies the structure as well as actual data.请注意:使用 String[] 和 StringBuilder[] 之间是有区别的。
在 String 中 - 如果更改 String,我们复制(通过 CopyTo 或 Clone)的指向同一字符串的其他数组将不会更改,但原始 String 数组将指向新 String,但是,如果我们使用 StringBuilder在数组中,String指针不会改变,因此,它将影响我们为此数组所做的所有副本。 例如:
Please note: There is a difference between using String[] to StringBuilder[].
In String - if you change the String, the other arrays we have copied (by CopyTo or Clone) that points to the same string will not change, but the original String array will point to a new String, however, if we use a StringBuilder in an array, the String pointer will not change, therefore, it will affect all the copies we have made for this array. For instance: