2010-06-02 10 views
15

He visto a desarrolladores usar dos enfoques cuando terminan con un objeto de sesión.ASP.NET 'Session.Remove (clave)' v/s 'Session (clave) = nada'

1) Session.Remove (clave)

2) Sesión (clave) = nada

¿Cuál es el mejor enfoque de los dos anteriores? ¿Session.Remove elimina el objeto almacenado automáticamente?

¿El segundo enfoque depende del recolector de basura para liberar realmente la memoria?

EDIT: Gracias por las respuestas, chicos. Parece que Session.Remove es la forma correcta de hacerlo. Sin embargo, si Session.Remove no garantiza la eliminación del objeto, ¿cuál es la mejor forma de eliminar el objeto almacenado en sesión cuando no lo necesitamos más?

Gracias.

Respuesta

19

Si configura el objeto a null o nada, la clave aún existe en la sesión aunque el valor sea null.

Este comportamiento es el mismo que el de cualquier otra clase de diccionario en el CLR.

Si desea eliminar un objeto completamente de la sesión, debe utilizar el método Session.Remove("key").

No arrojará una excepción si la clave no está presente en la sesión.

+1

¡Gracias por agregar que no lanzará una excepción si la clave no está presente! –

4

Preferiría Session.Remove (clave) porque también elimina la memoria utilizada para la clave en el diccionario de sesión; con el segundo enfoque, la referencia al valor se desasocia, pero la clave aún está presente en el diccionario de la sesión.

Ninguno de los enfoques llamará a deshacerse del objeto, que tiene que hacerse manualmente.

Ambos enfoques dependen del recolector de basura para liberar memoria. En la primera aproximación, la memoria para el objeto clave también puede estar disponible para su recolección. Recuerde también que el hecho de que haya eliminado una referencia al objeto del diccionario de sesión no significa que no esté referenciado en ningún otro lugar de su aplicación.

0

Session.Remove (clave) es en general, la forma más segura de ir si realmente quiere eliminar el objeto de la memoria caché. Tenga en cuenta que si utiliza la administración de la sesión inproc, el objeto no se serializará, por lo que existe la posibilidad de que otro gestor de sesiones no pueda consultarlo, por lo que el recolector de elementos no necesariamente lo limpiará. Si utiliza la gestión de sesión fuera de proceso, el objeto se serializa y, como resultado, no hay una representación "en memoria" del objeto y, por lo tanto, el recolector de basura no necesita "limpiarlo"

Configuración de la sesión (clave) = nada no elimina realmente la clave de la sesión, simplemente la establece en nulo. De nuevo, se aplican las mismas reglas sobre la recolección de basura.

1

La lógica real que se ejecuta en ambos casos está determinada por la implementación del tipo que implementa la interfaz ISessionStateItemCollection ubicada en el espacio de nombres System.Web.SessionState. El tipo concreto que implementa esa interfaz está determinado por el proveedor del almacén de sesión configurado.

Los proveedores integrados (In-Proc, State Server y SQL Server) utilizan la clase SessionStateItemCollection ubicada en el espacio de nombres System.Web.SessionState, por lo que esta es la implementación que se usará en la gran mayoría de casos, ya que la mayoría de las personas no implementan un proveedor de sesión personalizado.

Como otros han señalado, si el valor realmente se elimina de la sesión porque ya no necesita referencia, al menos por el momento, entonces probablemente debería llamar al método Remove solo por el bien de limpiando los mecanismos de almacenamiento interno del objeto Session. Ninguno de los métodos descarta explícitamente el objeto que se almacenó previamente con esa clave.