当我读到Array.cs
并不能保证副本成功并且事实上甚至可能破坏原始实例时,我正在查看Array.Copy()
的源代码(如果我是正确的话请纠正我)这里错了)。为了让您高枕无忧,ConstrainedCopy ()
似乎也达到了同样的目的。
我的问题是:
1 GT;为什么有人会使用Array.Copy()
,如果它似乎不能保证成功传输数据并继续可能损害原始实例?事实上,所有集合类似乎都使用Array.Copy()
来增加它们的实例大小。为什么不在这里使用ConstrainedCopy()
2 - ;那么一直使用ConstrainedCopy ()
的费用是多少?我假设ConstrainedCopy ()
会添加更多逻辑?
答案 0 :(得分:15)
Object[] objArray = { "Anakin", "Skywalker", 666 };
String[] stringArray = new String[3];
Array.Copy(objArray, stringArray , 3);
这会抛出无效的强制转换异常。即使抛出异常(如果你吞下它),objArray的前两个元素也会被复制到stringArray。
Array.ConstrainedCopy(objArray, 0, stringArray, 0, 3);
抛出System.ArrayTypeMismatchException,不会将任何元素复制到目标数组(stringArray)。
答案 1 :(得分:4)
ConstraintedCopy()不保证成功。 MSDN Docs的第一行说明:
从指定源索引处开始复制Array中的一系列元素,并将它们粘贴到从指定目标索引开始的另一个Array。保证如果副本没有完全成功,则撤消所有更改。
更具体地说,第二行:
如果副本不成功,保证撤消所有更改 完全。
在非常极端的情况下仍然会抛出异常。但是这些情况非常特殊,在大多数情况下你都不必担心它们。
简而言之,只需坚持使用Array.Copy()即可。
答案 2 :(得分:1)
请参阅此问题:C# quickest way to shift array
ConstrainedCopy略慢,但不显着