2011-08-22 7 views
6

Stavo passando attraverso il codice sorgente per Array.cs quando ho letto che Array.Copy() non fornisce una garanzia che una copia avrebbe avuto esito positivo e, anzi, potrebbe anche corrompere l'istanza originale (correggimi se io ho sbagliato qui). Per garantire la tranquillità, lo ConstrainedCopy() sembra raggiungere lo stesso risultato.Array.Copy e Array.ConstrainedCopy - C#

La mia domanda è:
1> Perché qualcuno dovrebbe utilizzare Array.Copy() se non sembra per garantire un corretto trasferimento dei dati e andando a male, eventualmente, l'istanza originale? Infatti, tutte le classi di raccolta sembrano utilizzare Array.Copy() per aumentare le dimensioni dell'istanza. Perché non utilizzare ConstrainedCopy() qui

2> Quanto sarebbe il costo dell'uso di ConstrainedCopy() in ogni momento? Presumo che ci sarebbe più logica aggiunta a ConstrainedCopy()?

risposta

4

ConstraintedCopy() non garantisce il successo. La prima riga di MSDN Docs dichiara:

Copia un intervallo di elementi da una matrice che inizia dall'indice di origine specificato e li incolla su un'altra matrice a partire dall'indice di destinazione specificato. Garantisce che tutte le modifiche vengano annullate se la copia non riesce completamente.

Più in particolare la seconda linea:

garanzie che tutte le modifiche vengono annullate se la copia non riesce completamente.

Un'eccezione può ancora essere generata in circostanze estreme. Tuttavia, tali circostanze sono eccezionali e non dovresti preoccuparti di esse nella maggior parte degli scenari.

In breve, basta usare Array.Copy().

+1

Puoi spiegare quali sono le circostanze estreme che possono causare eccezioni? Altrimenti non sapremo se il nostro scenario è quello in cui dobbiamo preoccuparci. – Gabe

+0

Touche, qualcosa come un'espettazione della memoria insufficiente può causare un errore della copia, la maggior parte di queste circostanze sono al di fuori dell'ambito del metodo di copia e di solito sono un segno di un problema più grande. – BentOnCoding

+3

La maggior parte delle eccezioni che possono essere generate dal metodo 'Copia' avvengono prima che inizi la copia, quindi non è necessario' ConstrainedCopy' per salvarti da un indice fuori intervallo o dalla mancata corrispondenza ype. Le uniche possibili eccezioni a cui posso pensare che possano accadere a metà copia sono 'InvalidCastException' e' ThreadAbortException'. – Gabe

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

    Questo genera un'eccezione getto valido. Anche dopo che l'eccezione è stata lanciata (se la si ingoia), i primi due elementi di objArray vengono copiati in stringArray.

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

    Questo genera uno System.ArrayTypeMismatchException e non copierà tutti gli elementi per la matrice di destinazione (StringArray).