2011-08-22 12 views
6

我在閱讀Array.cs的源代碼時,我發現Array.Copy()不能保證副本會成功並且事實上甚至可能破壞原始實例(如果我我錯了)。爲了提供安心,ConstrainedCopy()似乎達到了相同。Array.Copy和Array.ConstrainedCopy - C#

我的問題是:
1>爲什麼任何人使用Array.Copy()如果它似乎不能保證數據的成功傳輸並繼續可能傷害原始實例?事實上,所有集合類似乎都使用Array.Copy()來增加它們的實例大小。爲什麼不在這裏使用ConstrainedCopy()

2>那麼一直使用ConstrainedCopy()的成本是多少呢?我假設將有更多的邏輯添加到ConstrainedCopy()

回答

4

ConstraintedCopy()不保證成功。 MSDN文檔的第一行指出:

從指定源索引處開始,從一個Array複製一系列元素,並將它們粘貼到另一個從指定目標索引開始的Array。保證所有更改都沒有完成,如果副本沒有完全成功。

更具體而言,第二行:

保證,如果拷貝沒有成功 完全所有的更改都被撤消。

在非常極端的情況下仍然可以拋出異常。但是,這些情況是例外情況,您不應該在大多數情況下擔心它們。

總之,只要堅持Array.Copy()。

+1

你能解釋一下那些可能導致異常的極端情況嗎?否則,我們不會知道我們的情況是否是我們需要擔心的情​​況。 – Gabe

+0

Touche,類似於內存不足的問題可能會導致副本失敗,這些情況大多數都不在複製方法的範圍內,並且通常是更大問題的徵兆。 – BentOnCoding

+3

從複製方法拋出的大多數異常都發生在複製開始之前,因此您不需要使用'ConstrainedCopy'來將索引超出範圍或ype不匹配。我能想到的唯一可能的例外是中間拷貝,它們是'InvalidCastException'和'ThreadAbortException'。 – Gabe

15
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並且將不復制到目標陣列(字符串數組)的任何元素。