net - variables de session c# mvc 5




ASP.NET eliminando un elemento de la Sesión? (4)

¿Hay una diferencia?

Ahi esta. Session.Remove(key) borra la entrada (clave y valor) del diccionario, mientras que Session[key] = null asigna un valor (que pasa a ser nulo) a una clave. Después de la llamada anterior, la clave no aparecerá en la colección Session#Keys . Pero después de este último, la clave aún se puede encontrar en la colección de claves.

¿Qué método es el preferido?

Session.Remove("foo");

Session["foo"] = null;

¿Hay una diferencia?


La mayor diferencia es cómo lees de la sesión.

if(Session.ContainsKey["foo"]) { return Session["foo"]; }

o

if(Session["foo"] != null) { return Session["foo"]; }

Si usa el primer método, establecer el valor en null no funcionará, y debería usar eliminar.

Si usa el segundo método, puede establecer el valor en nulo.


Sé que este es un tema viejo, pero definitivamente me quedo con Session["key"] = null - ¡es mucho más rápido! He hecho algunas pruebas (en el estado de sesión de InProc), eliminando 1000 elementos en la fila (el tiempo transcurrido es de 1000 elementos en total, por lo que si desea un tiempo promedio para un elemento, simplemente divídalo con 1000):

Eliminando 1000 elementos existentes:

Session[key] = null; - 0.82380000000000009 ms
Session.Remove(key); - 59.960100000000004 ms

Eliminando 1000 elementos NO existentes:

Session[key] = null; - 1.5368000000000002 ms
Session.Remove(key); - 0.6621 ms

Eliminando 500 elementos existentes y 500 no existentes:

Session[key] = null; - 1.0432000000000001 ms
Session.Remove(key); - 33.9502 ms

Aquí hay una pieza de código para la primera prueba:

Session.Clear();

for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = new object();

Stopwatch sw1 = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = null;
sw1.Stop();

Session.Clear();

for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = new object();

Stopwatch sw2 = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
    Session.Remove(i.ToString());
sw2.Stop();

Tiene el mismo efecto. Personalmente creo que el método Session.Remove expresa mejor la intención del programador.

Aquí algunos enlaces a la documentación en MSDN:

"Propiedad HttpSessionState.Item:

Tipo de valor de propiedad: System.Object

El valor de estado de sesión con el nombre especificado o referencia nula (Nothing en Visual Basic) si el elemento no existe. "





session-variables