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?

È stato utile?

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 applicano

i 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")) {
    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top