2011-08-22 5 views
6

Estaba revisando el código fuente de Array.cs cuando leí que Array.Copy() no proporciona una garantía de que una copia sea exitosa y de hecho incluso corrompa la instancia original (corrígeme si estoy equivocado aquí). Para proporcionar tranquilidad, ConstrainedCopy() parece lograr lo mismo.Array.Copy y Array.ConstrainedCopy - C#

Mi pregunta es:
1> ¿Por qué alguien usar Array.Copy() si no parece garantizar una transferencia exitosa de los datos e ir a hacer daño, posiblemente, la instancia original? De hecho, todas las clases de colección parecen usar Array.Copy() para aumentar su tamaño de instancia. ¿Por qué no utilizar ConstrainedCopy() aquí

2> ¿Cuánto sería el costo de usar ConstrainedCopy() todo el tiempo, entonces? Supongo que se agregaría más lógica al ConstrainedCopy()?

Respuesta

4

ConstraintedCopy() no garantiza el éxito. La primera línea de MSDN Docs indica:

Copia un rango de elementos de una matriz que comienza en el índice de origen especificado y los pega en otra matriz que comienza en el índice de destino especificado. Garantiza que todos los cambios se deshacen si la copia no tiene éxito por completo.

Más específicamente la segunda línea:

garantiza que todos los cambios se revierten si la copia no tiene éxito por completo.

Aún puede producirse una excepción en circunstancias muy extremas. Sin embargo, esas circunstancias son excepcionales y no debería tener que preocuparse por ellas en la mayoría de los casos.

En resumen, simplemente quédate con Array.Copy().

+1

¿Puede explicarnos qué son esas circunstancias extremas que pueden causar excepciones? De lo contrario, no sabremos si nuestro escenario es uno en el que tenemos que preocuparnos. – Gabe

+0

Touche, algo así como una expección de falta de memoria puede causar una falla de la copia, la mayoría de estas circunstancias están fuera del alcance del método de copia y generalmente son un signo de un problema mayor. – BentOnCoding

+3

La mayoría de las excepciones que pueden producirse desde el método 'Copiar' suceden antes de que comience la copia, por lo que no es necesario que' ConstrainedCopy' lo salve de un índice fuera de rango o sí no coincida. Las únicas excepciones posibles que puedo pensar que podrían ocurrir a mitad de copia son 'InvalidCastException' y' ThreadAbortException'. – Gabe

15
Object[] objArray = { "Anakin", "Skywalker", 666 }; 
String[] stringArray = new String[3]; 
  1. Array.Copy(objArray, stringArray , 3);

    Esto arroja una excepción reparto no válido. Incluso después de que se lanza la excepción (si la traga), los primeros dos elementos del objArray se copian en el stringArray.

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

    Esto arroja una System.ArrayTypeMismatchException y no copiar ningún elemento a la matriz de destino (StringArray).