Rien = String.Empty (Pourquoi ces égaux?)
Question
Pourquoi la première instruction if évaluer true? Je sais que si je l'utilise « est » au lieu de « = » alors il ne sera pas évaluée à true. Si je remplace String.Empty avec « Foo » n'évalue pas vrai. Les deux String.Empty et « Foo » ont le même type de chaîne, alors pourquoi un vrai et à évaluer l'autre ne fonctionne pas?
//this evaluates to true
If Nothing = String.Empty Then
End If
//this evaluates to false
If Nothing = "Foo" Then
End If
La solution
Rien dans VB.net est la valeur par défaut pour un type. La spécification de la langue dit dans la section 2.4.7:
Rien n'est un littéral spécial; il ne dispose pas d'un type et est convertible à tous les types dans le système de type, y compris les paramètres de type. Lors de la conversion à un type particulier, il est l'équivalent de la valeur par défaut de ce type.
Alors, lorsque vous testez contre String.Empty, rien est converti en une chaîne, qui a une longueur 0. L'opérateur est-il doit être utilisé pour tester contre rien, et String.Empty.Equals (Rien) retournera également faux .
Autres conseils
Il est un cas particulier des opérateurs de =
et <>
de VB.
Les états Langue spécifications de la section 11.14 :
Quand vous faites une comparaison de chaîne, une référence null est équivalent au littéral de chaîne « ».
Si vous êtes intéressé par plus de détails, j'ai écrit une comparaison approfondie des vbNullString
, String.Empty
, ""
et Nothing
en VB.NET ici:
Essayez ceci:
Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))
L'opérateur =
n'applique pas les types égaux, alors que le .Equals()
méthode d'un objet de chaîne ne, comme le fait l'opérateur de Is
.
Concernant ce sujet, si vous utilisez une variable de chaîne initialisé avec « rien » à attribuer à la propriété « valeur » d'un SqlParameter ce paramètre est ignoré, non compris dans la commande envoyée au serveur, et un paramètre manquant l'erreur est levée. Si vous initialisez cette variable avec tout String.Empty va bien.
//This doesn't work
Dim myString as String = nothing
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString
//This works
Dim myString as String = string.empty
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString