2016-03-11 12 views
5

So che potrebbe sembrare una domanda molto stupida, ma non ho risposte su questo. Uno dei nostri utenti ha segnalato un bug di recente e mi sono reso conto che un vecchio bit di codice utilizzava != string.Empty piuttosto che IsNullOrEmpty(). L'ho risolto con IsNullOrEmpty() e ora funziona bene, ma mi piacerebbe davvero capire il problemaConfronto tra stringhe con operatore! = Che fornisce risultati diversi?

Il problema è che lo stesso identico bit di codice viene eseguito in modo diverso su determinate macchine. Fondamentalmente ho un oggetto: context["MODE"], che dovrebbe essere vuoto. Ho aggiunto alcuni test su di esso per accedere:

 contextBuilder.AppendLine("MODE: |" + context["MODE"] + "|"); 
     contextBuilder.AppendLine("MODE != string.Empty: " + (context["MODE"] != string.Empty)); 
     contextBuilder.AppendLine("MODE TRIM != string.Empty: " + (context["MODE"].ToString().Trim() != string.Empty)); 
     contextBuilder.AppendLine("MODE.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString())); 
     contextBuilder.AppendLine("MODE.TRIM.IsNullOrEmpty: " + string.IsNullOrEmpty(context["MODE"].ToString().Trim())); 

Qui sono i miei log su che informazioni di campo:

MODE: || 
MODE != string.Empty: False 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

Ecco le sue tronchi:

MODE: || 
MODE != string.Empty: True 
MODE TRIM != string.Empty: False 
MODE.IsNullOrEmpty: True 
MODE.TRIM.IsNullOrEmpty: True 

Come si può vedere non v'è una differenza: MODE != string.Empty è False per me (ha senso), vero per lui! MODE non è ovviamente nullo (altrimenti .ToString() avrebbe avuto esito negativo) Il problema è stato risolto utilizzando IsNullOrEmpty ma sto cercando di capire esattamente perché questo non funziona su alcuni computer degli utenti e non su altri. In genere con i miei test alcuni di noi non hanno avuto problemi, altri lo hanno avuto.

Non capisco davvero cosa posso imparare a riguardo. Perché la sua modalità è diversa da null e String.Empty, ma IsNullOrEmpty restituisce true? Si noti inoltre che il trim è in realtà string.Empty e

Grazie!

+1

'IsNullOrEmpty' fa in realtà la parte vuota confrontando il' Length' a 0. – juharr

+1

Prova anche stampare 'contesto [ "Mode"]. GetType(). Name' pure. – juharr

+0

Puoi fornire maggiori dettagli sull'origine del valore in 'context [" MODE "]'? Inoltre, ti sei assicurato che le versioni di .NET fossero le stesse su entrambe le macchine? –

risposta

4

Se si utilizza ToString(), è un'indicazione che il tipo di context["MODE"] è object. Se confronti un oggetto con una stringa usando !=, stai confrontando i riferimenti di stringa, non i valori di stringa effettivi.

Quindi "la sua modalità" è una stringa vuota che non è lo stesso riferimento di string.Empty.

Non utilizzare confronti di confronto su stringhe; assicurarsi sempre che entrambi i lati siano di tipo string prima di utilizzare == o !=.

Si noti che il compilatore C# dovrebbe avervi messo in guardia su questo: CS0252: Possible unintended reference comparison

+0

@clcto Questo è l'output corretto, perché non uguale a 'String.Empty' ha restituito false, il che significa che è uguale a' String.Empty' – Setsu

+0

Come ho detto questo era un vecchio bit di codice, scritto dal ragazzo che stava prendendo cura dell'app prima che io entri a far parte dell'azienda (e sì, c'era un avvertimento che gli mancava!). Mi chiedo piuttosto, perché i suoi risultati sono così? Il suo input è vuoto, ma non ha lo stesso riferimento di 'string.Empty'. Tuttavia quando I Trim lo ha lo stesso riferimento! Come potrebbe accadere questo? – Damascus

+0

Il tipo di ritorno di 'Trim()' è 'stringa', quindi il compilatore usa un confronto di valori in quel caso. – Daniel

Problemi correlati