Dans combien de langues Null n'est-il pas égal à quelque chose qui n'est même pas Null?
-
09-06-2019 - |
Question
Dans combien de langues Null n'est-il pas égal à quelque chose qui n'est même pas Null?
La solution
C'est ainsi en SQL (en tant que langage logique) car null signifie inconnu / indéfini.
Cependant, dans les langages de programmation (comme par exemple C ++ ou C #), un pointeur / une référence null est une valeur spécifique avec une signification spécifique - rien.
Deux riens sont équivalents, mais deux inconnus ne le sont pas. La confusion vient du fait que le même nom (null) est utilisé pour les deux concepts.
Autres conseils
Dans VB6, l'expression Null = Null
produira Null
au lieu de True
comme vous le souhaitiez.
Cela provoquera une erreur d’exécution si vous essayez de l’affecter à un booléen, mais si vous l’utilisez
comme condition de " If ... Then
" il agira comme False
. En outre, Null <> Null
sera également
produire IsNull()
, donc:
Dans VB6, vous pourriez dire que Nothing
n'est ni égal à lui-même (ni à quoi que ce soit d'autre), ni inégalitaire!
Vous êtes censé le tester à l'aide de la Nothing = Nothing
fonction.
VB6 a également d'autres valeurs spéciales:
-
is
pour les références d'objet.Missing
est une erreur de compilation. (vous êtes censé comparer avec "Missing = Missing
") -
IsMissing(foo)
pour les paramètres optionnels non renseignés. Il n’a pas de représentation littérale et vous ne pouvez même pas écrireEmpty
. (le test estIsEmpty()
) - <=> pour les variables non initialisées. Celui-ci effectue un test égal à lui-même bien qu'il y ait également une fonction <=>.
- ... laissez-moi savoir si j'en ai oublié un
Je me souviens d'avoir été un peu dégoûté de VB.
Oracle est comme ça.
SELECT * FROM dual WHERE NULL=null; --no rows returned
MySQL a un opérateur d'égalité null-safe, < = > ;, qui renvoie la valeur true si les deux côtés sont égaux ou nuls. Voir Documents MySQL .
En C #, Nullable < bool > possède des propriétés intéressantes par rapport aux opérateurs logiques, mais l'opérateur d'égalité est le même que les autres types de ce langage (c'est-à-dire ((bool?) null == (bool?) null) == true).
Pour préserver le court-circuité le comportement des opérateurs logiques court-circuités, et pour préserver la cohérence avec les opérateurs logiques non court-circuités, le booléen nullable a des propriétés intéressantes. Par exemple: true || null == true. false & amp; & amp; null == false, etc. Ceci est en contradiction directe avec d'autres langages logiques à trois valeurs tels que ANSI SQL .
Vous pouvez faire fonctionner le rubis de cette façon:
class Null
def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null
En SQL, vous devriez faire quelque chose comme:
WHERE column is NULL
plutôt que
WHERE column = NULL