Rien ne vaut String.Empty, nul ne correspond pas à String.Empty, qu'est-ce que je manque ici?

StackOverflow https://stackoverflow.com/questions/3131134

  •  01-10-2019
  •  | 
  •  

Question

Dans un projet de code mixte (VB et C #), nous avons été mise au point un peu ancien code Visual Basic comme ceci:

If Request.Params("xxx") <> "" Then
   'do something

Je considérais cela comme un bug Request.Params pourrait être null, dans ce cas, la déclaration serait faux sont devenus ce qui était pas l'idée.

Alors que je pensais. Je viens de découvrir - encore une fois - que la Nothing et C # de null de VB ne sont pas les mêmes choses et Nothing ne sont pas les mêmes que null . En fait:

if(String.Empty == null)          // in C# this is always false (correct)
If String.Empty = Nothing Then    ' in VB this is always true (????)

Comment est-ce possible? Est-ce une question de compatibilité descendante?

Était-ce utile?

La solution

Nothing a une signification particulière dans VB pour les chaînes. Pour tester si une référence de chaîne est nulle, vous avez besoin:

If value Is Nothing

De la comparaison VB opérateurs documentation :

  

comparaisons numériques traitent Rien que   0. Les comparaisons de chaînes traitent Rien que « » (une chaîne vide).

Je soupçonne que cela est juste pour la compatibilité ascendante avec VB6 -. Ce n'est pas quelque chose que je serais heureux avec, si j'étais un développeur VB

Comparaison de A de la forme

If value = Nothing

est compilé à un appel à Microsoft.VisualBasic.CompilerServices.Operators.CompareString qui retourne 0 (égaux) si un opérande est nul et l'autre est vide.

Autres conseils

En VB6, la valeur par défaut pour une variable de chaîne était une chaîne vide. Un programmeur VB6 se fondant sur un tel comportement ne serait pas « pire » qu'un programmeur C se fondant lors de l'initialisation par défaut zéro de variables int; les deux comportements ont été définis dans le cadre de la langue.

En outre, dans COM (le cadre sur lequel les versions précédentes de VB6 étaient fondées), toute une référence à la chaîne a été créée, une personne aurait à disposer manuellement de celui-ci. Étant donné que la chaîne la plus utilisée est la chaîne vide, de nombreuses méthodes COM sont explicitement documentées comme en ce qui concerne un pointeur NULL comme équivalent à une chaîne vide. Cela signifie qu'une fonction renvoyant une chaîne vide ou en passant comme paramètre une valeur ou de retour, on peut simplement passer un pointeur null sans avoir rien à allouer; le destinataire du pointeur NULL alors pas à quoi que ce soit désallouer.

Parce que les objets en .net ne nécessitent pas de désallocation explicite, les avantages de performance en ce qui concerne une référence null comme une chaîne vide ne sont plus applicables. Néanmoins, les méthodes qui sont appelées à partir du code qui pourrait attendre à un comportement similaire à celui des méthodes COM considérerons souvent des références de chaîne NULL comme étant la même que celle des chaînes vides.

Vous voulez

If Not String.IsNullOrEmpty(Request.Params("xxx") Then
    ...
End If

ou

if (!String.IsNullOrEmpty(Request.Params("xxx")) {
    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top