2012-04-04 16 views
20

Qualcuno può spiegare a me la differenza tra:Qual è la differenza tra Session.Add ("chiave", valore) e Sessione ["chiave"] = valore?

Session.Add("name",txtName.text); e Session["name"] = txtName.text;

E 'stata una questione intervista e ho risposto che entrambi memorizzare dati in formato key = "Value" come Dictionary classe in C#.

Ho ragione o c'è qualche differenza?

+2

Sono sicuro che c'è una bella documentazione di msdn su questo. Forse potresti cercarlo da solo ed essere meglio preparato per la prossima intervista. – jpm

+13

Questa è una * intervista * terribile. –

+2

@EricLippert, sono completamente d'accordo. Il processo di assunzione di uno sviluppatore è molto rotto nella maggior parte delle organizzazioni. – SolutionYogi

risposta

18

Guardando il codice per HttpSessionState ci mostra che sono in effetti gli stessi.

public sealed class HttpSessionState : ICollection, IEnumerable 
{ 
    private IHttpSessionState _container; 
... 
    public void Add(string name, object value) 
    { 
     this._container[name] = value; 
    } 

    public object this[string name] 
    { 
     get 
     { 
      return this._container[name]; 
     } 
     set 
     { 
      this._container[name] = value; 
     } 
    } 
... 
} 

quanto per loro sia

la memorizzazione dei dati in formato key = "Value" come Dictionary classe in C#.

In realtà memorizzano il risultato in un oggetto IHttpSessionState.

+1

Questa è un'ottima risposta perché mostra in codice esattamente il motivo per cui le due funzioni sono equivalenti e ciò aiuta a interiorizzare il concetto. Mi piace la nota in un altro commento di @matthew su Dictionary, perché ho sempre pensato che stessimo usando un dizionario o un altro hash table in stato di sessione, e sinceramente ho sempre fatto la sciocca danza per verificare se un valore esisteva già prima di aggiungere o modificare in base a quello. – TonyG

+0

Questo non è lo stesso perché: Quando esiste il __key__ il __valore__ è ** _ update _ ** ma se __key__ __doesn't__ esiste, ** _ crea _ ** con il __value__, se piace __ ** metodo SaveOrUpdate ** __. – Adhemar

9

I due frammenti di codice che hai postato sono la stessa funzionalità. Entrambi aggiornano (o creano se non esiste) un determinato oggetto Session definito dalla chiave.

Session.Add("name",txtName.text);

è uguale a:

Session["name"] = txtName.text;

Il primo è metodo basato, in cui il secondo è la stringa indicizzatore-based. Entrambi sovrascrivono il valore precedente detenuto dalla chiave.

+3

Al contrario di un 'dizionario', se si tenta di" aggiungere "a un dizionario due volte con la stessa chiave, si genera un'eccezione. L'indicizzatore di un 'Dictionary' funziona in modo simile all'oggetto' Session' (verrà aggiunto o aggiornato e non genererà un'eccezione). – Matthew

+0

@Matthew ottima nota aggiuntiva ... –

+0

@Mathew - Grazie per la nota extra –

Problemi correlati