2008-11-04 16 views

Respuesta

109

¿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.

+6

+1 para la respuesta simple y clara. –

+3

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. –

9

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.

8

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. "

4

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.

+2

HttpSessionState no tiene ContainsKey –

25

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(); 
+8

¿Hay alguna razón para tener 1000 elementos en sesión? – zgnilec

+1

@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

+1

@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. –

Cuestiones relacionadas