2010-12-05 1 views

Répondre

6

Non, la deuxième liste est en lecture seule non, il est toujours une liste générée à partir d'un IEnumerable<T> (spécifiquement un ICollection<T> ici). La méthode .AsReadOnly() donne simplement ReadOnlyCollection<MyObject>, mais nous ne modifions pas cette collection lorsque vous jouez avec la deuxième liste.

Au lieu de cela, vous avez créé une nouvelle List<MyObject> avec ses membres que est modifiable (via le constructeur List<T>(IEnumerable<T>)). Cela fait la génération comme n'importe quelle autre IEnumerable<T> source qui est un ICollection<T>, il effectue un .CopyTo() dessous.

Dans le cas d'un ReadOnlyCollection<T> (qui met en œuvre ICollection<T>), qu'il appelle .CopyTo() sur la IList<T> originale sous qu'il était de, donc en gros ce que vous avez est le même que:

List<MyObject> FirstList = new List<MyObject>(); 
// Add items to FirstList. 
List<MyObject> SecondList = new List<MyObject>(FirstList); 

.... en ce qui concerne la deuxième liste. Dans les autres cas où le IEnumerable<T> passé au constructeur est pas un ICollection<T>, il serait itérer sur la collection et .Add() chaque membre à la place ... mais il n'aurait toujours pas d'impact sur la mutabilité de la nouvelle liste et de ses membres.

Questions connexes