Diciamo che avere una classeToList() - Crea una nuova lista?
public class MyObject
{
public int SimpleInt{get;set;}
}
e ho un List<MyObject>
, e mi ToList()
e quindi modificare uno dei SimpleInt
, sarà il mio cambiamento essere propagato torna alla lista originale. In altre parole, quale sarebbe l'output del seguente metodo?
public void RunChangeList()
{
var objs = new List<MyObject>(){new MyObject(){SimpleInt=0}};
var whatInt = ChangeToList(objs);
}
public int ChangeToList(List<MyObject> objects)
{
var objectList = objects.ToList();
objectList[0].SimpleInt=5;
return objects[0].SimpleInt;
}
Perché?
P/S: Mi dispiace se sembra ovvio scoprirlo. Ma non ho compilatore con me ora ...
Si noti inoltre che con un 'List' di strutture, un assegnamento come' objectList [0] .SimpleInt = 5' non sarebbe consentito (errore di compilazione C#). Questo perché il valore di ritorno dell'accessorio 'get' dell'indicizzatore di lista non è una variabile (è una copia restituita di un valore di struct), e quindi _setting_ il suo membro' .SimpleInt' con un'espressione di assegnazione non è permesso (sarebbe mutato una copia che non viene conservata). Bene, chi usa comunque le strutture mutevoli? –
@Jeppe Stig Nielson: Sì. Analogamente, il compilatore smetterà anche di fare cose come 'foreach (var s in listOfStructs) {s.SimpleInt = 42; } '. Il gotcha _really_ nasty è quando si prova qualcosa come 'listOfStructs.ForEach (s => s.SimpleInt = 42)': il compilatore lo consente e il codice viene eseguito senza eccezioni, ma le strutture nell'elenco rimarranno invariate! – LukeH