2010-01-19 5 views
35

trato con un marco a diario en el que a veces proporcionan métodos que aceptan IEnumerable<MyBusinessObject> como un parámetro con el fin de mostrar las interfaces de usuario, realizar cálculos etc.¿Array.ToArray <>() devuelve la matriz original si es del mismo tipo?

Si paso en una serie de MyBusinessObject así:

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 
    } 
} 

¿la línea de objs.ToArray() simplemente resuelve el IEnumerable<MyBusinessObject> de nuevo a la matriz original, o tiene copiarlo en una gama completamente nueva, lista para su uso?

Respuesta

51

No, tendrá siempre obtenga una nueva copia de la matriz, aunque los objetos en ella no son copias, son las mismas referencias que en la matriz original.

Sería muy incoherente para los cambios en la matriz devuelta a a veces afectar a la fuente y, a veces no. ToList funciona de la misma manera por la misma razón.


Puede comprobar el código fuente (a partir de 2015) si es necesario para revisar los detalles: Enumerable.ToArray que a su vez crea la copia de elementos (optimizado para ICollection y por lo tanto Array[], pero todavía hace la copia) con Buffer class interna.

+0

No estoy seguro si esta debería ser otra pregunta, pero solo quería ver rápidamente si usted también lo sabe: '' IEnumerable .Count() 'llama a la propiedad' .Length' de la matriz para obtener un resultado, o hace algo terriblemente ineficiente? – Codesleuth

+2

Tiene que inclinarse ante Mr Skeet por eso. Personalmente, apuesto a que no (IEnumerable no tiene una propiedad de longitud). Sin embargo, existe la posibilidad de que haga algunas reflexiones inteligentes para ciertos escenarios como una optimización. El punto es, si quieres un conteo, IEnumerable no es apropiado - IList es. –

+0

@Codesleuth: mirando [el código fuente] (http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs), el método 'Count' verifica si el objeto implementa' ICollection ' o 'ICollection' (que hace una matriz) y usa su propiedad' Count' en lugar de recorrer los elementos. – Guffa

Cuestiones relacionadas