¿Qué método es el preferido?ASP.NET eliminando un elemento de la sesión?
Session.Remove("foo");
Session["foo"] = null;
¿Hay alguna diferencia?
¿Qué método es el preferido?ASP.NET eliminando un elemento de la sesión?
Session.Remove("foo");
Session["foo"] = null;
¿Hay alguna diferencia?
¿Hay alguna diferencia?
Hay. Session.Remove(key)
borra la entrada (ambas claves & 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.
Iría con Eliminar pero honestamente no puedo decir si hay una diferencia. Supongo que todavía puede haber una clave vacía guardada para ese valor nulo, pero no está seguro. Eliminar me daría pocas dudas y si eso es lo que quiere hacer, lee mejor en el código también.
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:
"HttpSessionState.Item propiedad:
Propiedad Valor Tipo: System.Object
El valor del estado de la sesión con el n especificado ame o referencia nula (Nothing en Visual Basic) si el elemento no existe. "
La mayor diferencia es cómo leer de la sesión.
if(Session.ContainsKey["foo"]) { return Session["foo"]; }
o
if(Session["foo"] != null) { return Session["foo"]; }
Si se utiliza el primer método, estableciendo el valor a null no va a funcionar, y usted debe utilizar remove.
Si usa el segundo método, puede establecer el valor en nulo.
HttpSessionState no tiene ContainsKey –
Sé que este es el hilo antiguo, pero definitivamente se queda con Session["key"] = null
- ¡es mucho más rápido!He hecho algunas pruebas (en estado de sesión 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):
Eliminación de 1000 elementos existentes:
Session[key] = null; - 0.82380000000000009 ms
Session.Remove(key); - 59.960100000000004 ms
Extracción de 1000 elementos existentes: nO
Session[key] = null; - 1.5368000000000002 ms
Session.Remove(key); - 0.6621 ms
Extracción de 500 existentes y 500 elementos no existentes:
Session[key] = null; - 1.0432000000000001 ms
Session.Remove(key); - 33.9502 ms
Aquí es 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();
¿Hay alguna razón para tener 1000 elementos en sesión? – zgnilec
@zgnilec Estoy de acuerdo contigo pero creo que JakubRi solo quiere comparar la velocidad de ambos y mostrarnos, excepto que creo que el mundo de la programación es enorme y nadie puede hablar sobre la manera de codificar explícitamente. Esta respuesta no está relacionada con mi proyecto actual, pero creo que se merece +1. – QMaster
@zgnilec Es poco probable que haya tantos elementos por sesión, pero es una manera de probar el proceso MÁS de 1000 sesiones, cada una perteneciente a un usuario diferente. –
+1 para la respuesta simple y clara. –
Se sabe que el estado de la sesión InProc es altamente inestable bajo carga. Si se abusa (sucede todo el tiempo), entonces Session ["foo"] = null tendrá un mejor rendimiento que Session.Remove ["foo"]. El recolector de basura debería limpiar el desorden de las variables de sesión excesivas. –