2010-01-19 2 views
35

tratto con un quadro su base giornaliera dove a volte fornendo metodi che accettano IEnumerable<MyBusinessObject> come parametro per mostrare interfacce utente, eseguire calcoli eccArray.ToArray <>() restituisce l'array originale se è dello stesso tipo?

Se passo in un array di MyBusinessObject questo modo:

MyBusinessObject[] myArray = new MyBusinessObject { obj1, obj2, ..., objN }; 
frameworkClass.MyMethod(myArray); 

.... 

public class FrameworkClass 
{ 
    public void MyMethod(IEnumerable<MyBusinessObject> objs) 
    { 
     // Other code that uses the enumerable 
     MyBusinessObject[] objectArray = objs.ToArray();    
     // More code that uses the enumerable 
    } 
} 

Condivide la linea di objs.ToArray() semplicemente risolvere il IEnumerable<MyBusinessObject> torna alla matrice originale, o lo fa copiarlo ad un nuovo array, pronto per l'uso?

risposta

51

No, sarà sempre ottenere una nuova copia dell'array, sebbene gli oggetti in esso non siano copie, sono gli stessi riferimenti nell'array originale.

Sarebbe molto incoerente per le modifiche alla matrice restituita a a volte influenzare la fonte e talvolta no. ToList funziona allo stesso modo per lo stesso motivo.


È possibile controllare il codice sorgente (a partire dal 2015) se è necessario per rivedere i dettagli: Enumerable.ToArray che a sua volta crea copia di elementi (ottimizzata per ICollection e quindi Array[], ma ancora facendo copia) con interno Buffer class.

+0

Non sono sicuro se questa dovrebbe essere un'altra domanda, ma volevo solo vedere rapidamente se lo sapete anche voi: 'IEnumerable .Count()' chiama la proprietà '.Length' dell'array per ottenere un risultato, o fa qualcosa di orribilmente inefficiente? – Codesleuth

+2

Devo inchinarmi al signor Skeet per quello. Personalmente, scommetto che non lo è (IEnumerable non ha una proprietà Length). Tuttavia c'è una possibilità che faccia qualche riflessione intelligente per determinati scenari come un'ottimizzazione. Il punto è, se si desidera un conteggio, IEnumerable non è appropriato - è il numero di IList. –

+0

@Codesleuth: guardando [il codice sorgente] (http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs), il metodo 'Count' verifica se l'oggetto implementa' ICollection ' o 'ICollection' (che fa un array) e usa la sua proprietà' Count' invece di scorrere gli oggetti. – Guffa