【问题标题】:Array.Copy and Array.ConstrainedCopy - C#Array.Copy 和 Array.ConstrainedCopy - C#
【发布时间】:2011-08-22 03:00:33
【问题描述】:

我正在浏览Array.cs 的源代码,当时我读到Array.Copy() 不能保证复制会成功,甚至可能损坏原始实例(如果我在这里错了,请纠正我)。为了让您安心,ConstrainedCopy () 似乎也达到了同样的效果。

我的问题是:
1> 如果Array.Copy() 似乎不能保证数据的成功传输并且可能会损害原始实例,为什么有人会使用它?事实上,所有集合类似乎都使用Array.Copy() 来增加它们的实例大小。为什么不在这里使用ConstrainedCopy()

2> 那么一直使用ConstrainedCopy () 的成本是多少?我假设ConstrainedCopy () 会添加更多逻辑?

【问题讨论】:

    标签: c# arrays


    【解决方案1】:
    Object[] objArray = { "Anakin", "Skywalker", 666 };
    String[] stringArray = new String[3];
    
    1. Array.Copy(objArray, stringArray , 3);

      这会引发无效的强制转换异常。即使在抛出异常之后(如果你吞下它),objArray 的前两个元素也会被复制到 stringArray。

    2. Array.ConstrainedCopy(objArray, 0, stringArray, 0, 3);

      这会引发 System.ArrayTypeMismatchException 并且不会将任何元素复制到目标数组 (stringArray)。

    【讨论】:

      【解决方案2】:

      ConstraintedCopy() 不保证成功。 MSDN Docs 的第一行声明:

      从指定源索引开始的数组中复制一系列元素,并将它们粘贴到从指定目标索引开始的另一个数组中。保证如果复制没有完全成功,所有更改都将撤消。

      更具体地说是第二行:

      保证如果复制不成功,所有更改都将撤消 完全。

      在非常极端的情况下仍然可能引发异常。但是这些情况是异常的,在大多数情况下您不必担心它们。

      简而言之,只要坚持使用 Array.Copy()。

      【讨论】:

      • 您能解释一下哪些极端情况会导致异常吗?否则我们将不知道我们的场景是否是我们需要担心的场景。
      • 碰一下,像内存不足的预期会导致复制失败,大多数情况都超出了复制方法的范围,通常是更大问题的征兆。
      • 大多数可以从Copy 方法抛出的异常都发生在复制开始之前,因此您不需要ConstrainedCopy 来避免索引超出范围或类型不匹配。我能想到的唯一可能的例外情况可能发生在副本中间是InvalidCastExceptionThreadAbortException
      【解决方案3】:

      看到这个问题:C# quickest way to shift array

      ConstrainedCopy 稍慢,但不明显

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        相关资源
        最近更新 更多