Sono su un progetto ASP.Net 2.0, in C#. Ho alcuni dati che vengono memorizzati nello stato di sessione. Per facilità d'uso, è racchiuso in una proprietà, come questa:I setter della proprietà .Net vengono mai chiamati implicitamente?
protected IList<Stuff> RelevantSessionData
{
get
{
return (IList<Stuff>) Session["relevant_key"];
}
set
{
Session["relevant_key"] = value;
}
}
Ottenere e impostare il valore funziona esattamente come ci si aspetterebbe. Se voglio cancellare il valore, lo imposto su null e non ci sono problemi. Tuttavia, nella pagina di un altro sviluppatore, chiama il metodo Clear() della raccolta. Ho pensato che sarebbe stato un bug, ma sembra funzionare, e non capisco perché. Funziona in questo modo:
Debug.WriteLine(RelevantSessionData.Count); //outputs, say, 3
RelevantSessionData.Clear();
Debug.WriteLine(RelevantSessionData.Count); //outputs 0
Perché funziona? La mia ingenua aspettativa sarebbe che la linea di mezzo carica il valore serializzato dalla sessione, deserializza in un oggetto, chiama Clear()
su quell'oggetto e quindi lascia l'oggetto senza nome fuori dall'ambito. Questo sarebbe un bug, perché il valore memorizzato in Session rimarrebbe invariato. Ma a quanto pare, è abbastanza intelligente chiamare invece il setter della proprietà e serializzare nuovamente la nuova collezione modificata in sessione.
Questo mi rende un po 'nervoso, perché ci sono posti nel nostro codice legacy in cui i setter hanno effetti collaterali, e non voglio che quelli vengano chiamati se non sono destinati.
Il setter della proprietà viene sempre chiamato in una situazione come questa? Sta succedendo qualcos'altro? O ho completamente frainteso cosa sta succedendo qui?
[Aggiunto per spiegare la risposta]
Si è verificato un equivoco. Sapevo che gli oggetti archiviati in Session devono essere serializzabili e sulla base di ciò ho fatto troppe ipotesi su come la raccolta si comporta internamente. Stavo pensando troppo.
C'è solo un'istanza dell'oggetto memorizzato (my IList
). Ogni chiamata al getter restituisce un riferimento alla stessa istanza. Quindi il codice sopra riportato funziona esattamente come appare, senza richiedere magie speciali.
E per rispondere alla domanda del titolo: No, i setter non sono chiamati implicitamente.
Aha! Avevo pensato che, poiché i valori in Session dovevano essere serializzabili, sarebbero stati memorizzati in uno stato serializzato, e ognuno avrebbe restituito un riferimento diverso. Se questo non è il caso, ed è abbastanza intelligente da restituire lo stesso riferimento su più chiamate, allora stavo proprio pensando troppo. – Auraseer