2008-11-04 5 views

Répondre

109

Y a-t-il une différence?

Il y a. Session.Remove(key) supprime l'entrée (valeur clé à la fois &) du dictionnaire tandis que Session[key] = null attribue une valeur (qui se trouve être nulle) à une clé. Après l'appel précédent, la clé n'apparaîtra pas dans la collection Session#Keys. Mais après ce dernier, la clé peut encore être trouvée dans la collection de clés.

+6

+1 pour réponse simple et claire. –

+3

L'état de session InProc est connu pour être hautement instable en charge. Si c'est abusé (arrive tout le temps), Session ["foo"] = null sera plus performant que Session.Remove ["foo"]. Le garbage collector devrait nettoyer le désordre des variables de session excessives. –

9

J'irais avec Remove, mais je ne peux pas dire honnêtement s'il y a une différence. En cas de doute, il se peut qu'une clé vide soit toujours conservée pour cette valeur nulle mais pas sûre. Supprimer me donnerait peu de doute et si c'est ce que vous voulez le faire lit aussi mieux dans le code.

8

Cela a le même effet. Personnellement, je pense que la méthode Session.Remove exprime mieux l'intention du programmeur.

Voici quelques liens vers la documentation sur MSDN:

« HttpSessionState.Item Propriété:

Propriété Valeur Type: System.Object

La valeur de l'état de session avec le n spécifié ame ou référence null (Nothing en Visual Basic) si l'élément n'existe pas. "

4

La plus grande différence est la façon dont vous lisez de la session.

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

ou

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

Si vous utilisez la première méthode, définir la valeur null ne fonctionnera pas, et vous devez utiliser supprimer.

Si vous utilisez la seconde méthode, vous pouvez définir la valeur sur null.

+2

HttpSessionState n'a pas ContainsKey –

25

Je sais que c'est un vieux fil mais définitivement coller avec Session["key"] = null - c'est beaucoup plus rapide!J'ai fait quelques tests (sur InProc Session State), en supprimant 1000 éléments dans la ligne (le temps écoulé est de 1000 items, donc si vous voulez un temps moyen pour un item, il suffit de le diviser avec 1000):

éléments existants:

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

Retrait de 1000 articles non existants:

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

500 Retrait des éléments existants et 500 non existants:

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

Voici un morceau de code pour le premier essai:

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

Y a-t-il une raison d'avoir 1000 éléments en session? – zgnilec

+1

@zgnilec Je suis d'accord avec vous, mais je pense que JakubRi veut juste comparer la vitesse des deux et nous montrer, sauf que je pense que le monde de la programmation est énorme et personne ne peut parler explicitement de codage. Cette réponse n'est pas liée à mon projet actuel mais je pense qu'elle mérite +1. – QMaster

+1

@zgnilec Il est peu probable qu'il y aura autant d'éléments PAR session, mais c'est un moyen de tester le processus PLUS de 1000 sessions, chacune appartenant à un utilisateur différent. –