Rien n'égale la Chaîne.Vide, null n'est pas égale à la Chaîne.Vide, ce qui me manque ici?
Dans un mélange de code du projet (VB et C#), nous avons le débogage de certains vieux Visual Basic code comme ceci:
If Request.Params("xxx") <> "" Then
'do something
Je considère que c'est un bogue de la Demande.Params pourrait être null
, auquel cas la déclaration ai faux, ce qui n'était pas l'idée.
Alors j'ai pensé. Je viens de découvrir -- encore -- que VB est Nothing
et de C# null
ne sont pas les mêmes choses et Nothing
n'est pas le même 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 même possible? C'est une descendante de problème de compatibilité?
OriginalL'auteur Abel | 2010-06-28
Vous devez vous connecter pour publier un commentaire.
Nothing
a une signification spéciale dans VB pour les chaînes. Pour tester si une chaîne de référence est nulle, vous avez besoin de:De la VB opérateurs de comparaison de la documentation:
Je suppose que c'est juste pour la compatibilité descendante avec VB6 - ce n'est pas quelque chose que je serais heureux, si j'étais un développeur VB.
Une comparaison de la forme
est compilé pour un appel à
Microsoft.VisualBasic.CompilerServices.Des opérateurs.CompareString
qui renvoie 0 (c'est à dire l'égalité) si l'un des opérandes est nulle et l'autre est vide.Ah, ignorer mon commentaire précédent. Vous avez modifié entre-temps. C'est mieux comme ça, merci pour la référence. Je ne suis pas très heureux avec elle. Tout (plus) d'idées sur le "pourquoi" de la partie? Sonne un peu comme Perl: tout est une chaîne de caractères jusqu'à nouvel avis.
Il est trop tard pour changer le comportement de maintenant. Ils auraient pu le faire à l'VB6 / VB7 point, mais a décidé de ne pas. Ils ont essayé de préserver la compatibilité dans beaucoup d'endroits, où ils le pouvaient. Ils ne sont pas particulièrement voulez les gens à utiliser VB6 maintenant, autant que je suis au courant.
Pour .NET 4.0, ils ont amené les choses de plus près en termes d'accès à la fonctionnalité, à ne pas faire les deux langues identiques, mais l'épeautre différemment si ils l'ont fait, pourquoi avoir deux langues? Mais Rien n'est un étrange et magique de la bête dans VB.Net - Dans le code générique, il est parfois plus proche de l'être par défaut(T)
c'est une bonne comparaison, merci! @Jon: merci pour la mise à jour, je seconde votre avis 🙂
OriginalL'auteur Jon Skeet
En vb6, la valeur par défaut pour une variable de type string est une chaîne vide. Un programmeur vb6 s'appuyer sur un tel comportement aurait pas de "pire" qu'un programmeur C en invoquant par défaut à zéro de l'initialisation des variables int; les deux comportements ont été précisées dans le cadre de la langue.
En outre, dans le document COM (le cadre à partir duquel les versions précédentes de VB6 sont fondées), en tout temps, une référence à la chaîne a été créé, quelqu'un aurait manuellement éliminer. Depuis la plus couramment utilisée de la chaîne est la chaîne vide, de nombreuses méthodes COM sont explicitement documentées en ce qui concerne un pointeur null comme équivalent à une chaîne vide. Cela signifie qu'une fonction retournant une chaîne vide ou de passer en tant que valeur du paramètre ou de retour on peut tout simplement passer un pointeur null sans avoir à allouer quelque chose; le destinataire du pointeur null sera alors de ne pas avoir de désallouer de quoi que ce soit.
Étant donné que les Objets .net ne nécessitent pas de libération de la mémoire explicite, les avantages du sujet d'une référence null comme une chaîne vide ne s'appliquent plus. Néanmoins, les méthodes qui sont appelées à partir de code qui pourrait s'attendre à un comportement similaire à celui de la COM méthodes considèrent souvent la chaîne null références comme étant le même que les cordes à vide.
OriginalL'auteur supercat
Vous voulez
Ou
Nothing
n'est pasnull
, alors que bien souvent il est.Ouais juste mal lu, encore cela permet d'éviter ce problème. = en VB.NET est différent de == comme Jon Skeet précise (ce qui devrait être accepté).
Je pense que le point principal est que, dans de BASE, la chaîne n'est pas un pointeur, c'est juste zéro ou plusieurs caractères. Par conséquent, il n'est pas possible de la comparer à la valeur NULL.
Même dans de BASE, la chaîne est un pointeur, mais il est caché par la langue. C'est VB.NET, pas de BASE. Les pointeurs sont devenus proche disparu .NET (sans danger pour certains le code unsafe) et ont été remplacées par les références. N'importe quelle langue .NET est lié à la CLR spécification, ce qui signifie une chaîne de caractères est un type de référence qui est spécialement traités (c'est à dire: en lecture seule).
OriginalL'auteur Matt Mitchell