Non sono uno sviluppatore di Asp.net/C# ma di recente ho dovuto ridefinire leggermente un progetto di Asp.net/C# e a un certo punto ho dovuto usare Session
. Quando lavoravo con la sessione, indipendentemente dal tipo di dati che stavo specificando per la variabile di sessione, ho dovuto eseguire il cast della variabile di sessione ogni volta che dovevo accedervi.
Session["index"] = 0;
Session["index"] = Session["index"] + 1; // throws exception
Session["index"] = ((int)Session["index"]) + 1; // it works here
Chiedendo ai miei colleghi sviluppatori di C #, sembra che il Session
sia in qualche modo un oggetto che copre il tipo di dati effettivo della variabile, apparentemente senza perderlo, ma per qualche motivo devi comunque lanciarlo comunque ogni volta che vuoi accedervi.
Non sono sicuro che sia così o no, anche se l'ho capito correttamente, ma quello che non capisco è perché debba essere implementato in modo che lo sviluppatore debba lanciarlo prima di usarlo . Come dicono i miei colleghi, è perché in pratica puoi avere un oggetto di sessione tipizzato dinamicamente, in fase di esecuzione.
Quello che sto pensando è, in primo luogo, perché è necessario disporre di tale funzionalità solo per la sessione, in un linguaggio tipizzato in modo statico come Asp.net/C#? Ad esempio, qual è il caso di utilizzo della definizione di una variabile "sessione" come un numero intero, ma in seguito inserire una stringa al momento dell'esecuzione? Esiste un caso pratico e un requisito per tale funzione, non solo in Asp.net ma in qualsiasi altra lingua?
In secondo luogo, se supponiamo che anche le variabili di sessione debbano essere tipizzate staticamente, allora è "tecnicamente" possibile implementare la sessione di Asp.net in modo tale che quando si definisce una variabile di sessione come di seguito, il compilatore alloca la memoria nell'heap, tieni il tipo di dati accanto ad esso e semplicemente elimina la necessità di lanciarlo ogni volta?
Session["index"] = 0; // integer type, available at compile-time
Che cosa accadrebbe se provassi ad assegnare una stringa a questa variabile intera? Bene, come tutto il resto in un linguaggio tipizzato staticamente, otterrai un'eccezione.
Mi manca qualcosa qui? Semplicemente non riesco a capire perché una tale decisione di progettazione sia stata presa dal team di sviluppo di Asp.net e da come lo sviluppatore potrebbe trarne vantaggio. Ci si chiede anche se ci sia qualcosa di correlato al modo in cui altri linguaggi come Java o C ++ hanno implementato le sessioni, direttamente nella lingua stessa o tramite una libreria, quindi ha portato anche il team di Asp.net a implementare una sessione del genere?
Aggiornamento # 1
Solo per chiarire l'aria, la mia domanda principale è perché il Session
è stato implementato in questo modo? Quali sono i vantaggi di avere una sessione come questa - qualunque essa sia, piuttosto come è stata implementata - anche se sto cercando di sapere anche quello.
Aggiornamento n. 2
Per quanto riguarda il commento @JacquesB: "Devi essere in grado di salvare tutti i tipi di oggetti diversi in una Session, quindi il tipo deve essere Object, non c'è altra opzione" ; Perché il seguente codice:
Session["index"] = 0;
Session["name"] = "abc";
Non può essere tradotto, dal compilatore, in fase di compilazione, a qualcosa di simile a questo:
int SessionIndex = 0;
string SessionName = "abc";
Non capisco perché "non c'è altra opzione". Dopo tutto, è un programma per computer, non qualcosa di magico, o mi manca ancora qualcosa?