Ho codice simile al seguente:Possibile confronto di riferimento non intenzionale lavorato come previsto
this.Session[key] = "foo";
if ((this.Session[key] ?? string.Empty) == "foo")
{
//do stuff
}
Questo, naturalmente, crea un "paragone possibile riferimento intenzionale funzionato come previsto" situazione. La soluzione a questo è ben documentata qui, e sapevo già che la soluzione era di trasmettere la variabile di sessione a string
non appena ho visto il codice.
Tuttavia, il codice è vecchio di anni e non è mai stato modificato poiché è stato scritto in origine. Fino a questa settimana nel nostro ambiente di test, l'istruzione if
valutata come vera ed eseguita la sezione //do stuff
. Questo codice errato continua a funzionare come previsto nel nostro ambiente di produzione.
Come può essere? Non c'è ragione per cui questo codice come scritto dovrebbe mai funzionare come previsto; eppure lo ha fatto, e lo fa ancora in produzione. E cosa sarebbe cambiato per rendere questo codice che non avrebbe dovuto funzionare ma, improvvisamente, smesso di funzionare (o meglio, comportarsi come dovrebbe sempre avere)?
è la sessione fuori dall'ambiente di test in ambiente di test? –
Sono confuso da due cose in questa domanda. Innanzitutto, la domanda contiene un errore logico: l'azione del codice è sempre stata la stessa. Confronta due riferimenti per l'uguaglianza. Se produce vero, è perché i riferimenti sono uguali. Se produce una coerenza coerente, i riferimenti sono sempre uguali. Non capisco di cosa sei confuso qui. In secondo luogo, non posso per la vita di me capire che cosa intende intendere l'operatore a coalescenza nulla qui. Il codice significa "se il valore è nullo, confronta vuoto con null", ma perché? il valore non è già "foo" se null! –
In che modo è impostata la 'Sessione [chiave]'? A cosa è paragonato? Quale versione di .NET Framework usi negli ambienti di test e di produzione? Ci deve essere una certa differenza tra i due ambienti che ha causato l'internazionalizzazione delle stringhe a funzionare in modo diverso. Il codice che hai pubblicato utilizza 2 stringhe letterali - afaik, queste saranno sempre internate a meno che l'interning non sia disattivato a livello di assembly. –