Niente è uguale a String.Empty, null non uguale String.Empty, quello che mi manca qui?
-
01-10-2019 - |
Domanda
In un progetto di codice misto (VB e C #) siamo stati il ??debug di qualche vecchio codice Visual Basic in questo modo:
If Request.Params("xxx") <> "" Then
'do something
Ho considerato questo un bug come Request.Params potrebbe essere null
, nel qual caso la dichiarazione avrebbe fatto falsa diventato che non era l'idea.
Così ho pensato. Ho appena scoperto - ancora una volta - che Nothing
di VB e C # null
s 'non sono le stesse cose e Nothing
non è lo stesso di null
. Infatti:
if(String.Empty == null) // in C# this is always false (correct)
If String.Empty = Nothing Then ' in VB this is always true (????)
Come è possibile? È questa una problema di compatibilità a ritroso?
Soluzione
Nothing
ha uno speciale significato in VB per le stringhe. Per verificare se un riferimento stringa è nulla, è necessario:
If value Is Nothing
VB documentazione operatori di confronto :
confronti numerici trattano Niente come 0. I confronti di stringhe trattano Niente come "" (una stringa vuota).
Ho il sospetto che questo è solo per la compatibilità con VB6 -. Non è qualcosa che sarei felice con, se fossi uno sviluppatore VB
Un confronto della forma
If value = Nothing
è compilato per una chiamata a Microsoft.VisualBasic.CompilerServices.Operators.CompareString
che restituisce 0 (cioè uguale) se un operando è nullo e l'altro è vuoto.
Altri suggerimenti
In vb6, il valore predefinito per una variabile stringa è una stringa vuota. Un programmatore VB6 fare affidamento su tale comportamento non sarebbe "peggio" di un programmatore C fare affidamento su di default zero inizializzazione delle variabili int; entrambi i comportamenti sono stati specificati come parte del linguaggio.
Inoltre, nel documento COM (quadro su cui si basavano le versioni precedenti di VB6), ogni volta che è stato creato un riferimento a stringa, qualcuno avrebbe dovuto manualmente disporne. Poiché la stringa più comunemente utilizzato è la stringa vuota, molti metodi COM sono esplicitamente documentate come riferimento un puntatore nullo equivalente ad una stringa vuota. Ciò significa che una funzione che restituisce una stringa vuota o passano uno come un parametro di valore o di ritorno si può semplicemente passare un puntatore nullo, senza dover assegnare nulla; il destinatario del puntatore nullo quindi non c'è bisogno di de-allocare nulla.
Poiché Oggetti NET non richiedono deallocazione esplicita, non si applicanoi vantaggi prestazionali di riferimento riferimento null come una stringa vuota. Tuttavia, i metodi che vengono chiamati dal codice che potrebbe aspettarsi un comportamento simile a quello dei metodi COM spesso riguardare riferimenti stringa vuota come lo stesso come stringhe vuote.
Si desidera
If Not String.IsNullOrEmpty(Request.Params("xxx") Then
...
End If
o
if (!String.IsNullOrEmpty(Request.Params("xxx")) {
...
}