Ciao a tutti,

ho rilevato un comportamento di ASP.NET 4 che non riesco a spiegarmi. Forse voi potete illuminarmi a riguardo.

Dunque, supponiamo di avere una pagina con una proprietà come questa:

protected List<Riga> RigheGriglia
{
  get { return ViewState["Righe"] as List<Riga>; }
  set { ViewState["Righe"] = value; }
}


Se io vado a fare:

RigheGriglia = new List<Riga>();
var listaRighe = RigheGriglia;
var nuovaRiga = new Riga() { <inizializzazione> };
listaRighe.Add(nuovaRiga);


mi aspetto di trovarmi con:

listaRighe.Count() ==> 1
RigheGriglia.Count() ==> 0


invece in realtà ottengo:

listaRighe.Count() ==> 1
RigheGriglia.Count() ==> 1 <---- PERCHE'?

perchè viene modificata anche la lista nel ViewState anche se non viene eseguito il setter della proprietà? Sicuramente c'è qualcosa che mi sfugge....

Grazie
Ciao
Federico
Ciao,

la ragione è che List<T> è un refence type, quindi non stai "copiando" la lista, ma semplicemente il riferimento.

Per fare ciò che vuoi devi creare una nuova lista, contenente i medesimi elementi di quella originale, così:

var listaRighe = new List<Riga>(RigheGriglia);


Marco
Sono perfettamente d'accordo con te che stiamo lavorando con dei reference. Mi aspettavo però che il getter della proprietà RigheGriglia eseguisse una deserializzazione dal ViewState, generando un nuovo reference ad ogni chiamata.
Pensavo che l'operazione di deserializzazione dal ViewState rendesse la variabile locale indipendente dall'effettivo valore memorizzato nel ViewState. A quanto vedo invece questo non accade.

Grazie
Ciao
Federico

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC