Estoy en un proyecto ASP.Net 2.0, en C#. Tengo algunos datos que se almacenan en el estado de la sesión. Para facilitar su uso, está envuelto en una propiedad, como esta:¿Alguna vez se llama implícitamente a los establecedores de propiedades .Net?
protected IList<Stuff> RelevantSessionData
{
get
{
return (IList<Stuff>) Session["relevant_key"];
}
set
{
Session["relevant_key"] = value;
}
}
Obtener y establecer el valor funciona exactamente como era de esperar. Si quiero borrar el valor, simplemente lo configuro como nulo y no hay problemas. Sin embargo, en la página de otro desarrollador, llama al método Clear() de la colección. Pensé que esto sería un error, pero parece funcionar, y no entiendo por qué. Funciona de la siguiente manera:
Debug.WriteLine(RelevantSessionData.Count); //outputs, say, 3
RelevantSessionData.Clear();
Debug.WriteLine(RelevantSessionData.Count); //outputs 0
Por qué funciona esto? Mi ingenua expectativa sería que la línea media carga el valor serializado de la sesión, se deserializa en un objeto, llama al Clear()
en ese objeto y luego deja que el objeto sin nombre se salga del alcance. Eso sería un error, porque el valor almacenado en Session se mantendría sin cambios. Pero, al parecer, es lo suficientemente inteligente como para llamar a la propiedad setter y serializar la colección nuevamente modificada nuevamente en la sesión.
Esto me pone un poco nervioso, porque hay lugares en nuestro código heredado donde los establecedores de propiedades tienen efectos secundarios, y no quiero que se llamen si no se pretende.
¿El sistema de establecimiento siempre se llama en una situación como esta? ¿Algo más está pasando? ¿O no entiendo completamente lo que está sucediendo aquí?
[Agregado a la explicación de la respuesta]
Resulta que no entendí bien. Sabía que los objetos almacenados en Session deben ser serializables y, en base a eso, hice demasiadas suposiciones sobre cómo se comporta la colección internamente. Estaba pensando demasiado.
Solo hay una instancia del objeto almacenado (mi IList
). Cada llamada al getter devuelve una referencia a esa misma instancia. Por lo tanto, el código citado anterior funciona tal como aparece, sin necesidad de magia especial.
Y para responder a la pregunta del título: No, no se llaman implícitamente los ajustadores.
Aha! Había asumido que debido a que los valores en Session deben ser serializables, se almacenarían en estado serializado, y cada get devolvería una referencia diferente. Si ese no es el caso, y es lo suficientemente inteligente como para devolver la misma referencia en varias llamadas, entonces estaba pensando demasiado. – Auraseer