¿En cuántos idiomas Null no es igual a nada ni siquiera Null?
-
09-06-2019 - |
Pregunta
¿En cuántos idiomas Null no es igual a nada ni siquiera Null?
Solución
Es así en SQL (como lenguaje lógico) porque nulo significa desconocido/indefinido.
Sin embargo, en los lenguajes de programación (como, por ejemplo, C++ o C#), un puntero/referencia nula es un valor específico con un significado específico: nada.
Dos nadas son equivalentes, pero dos incógnitas no lo son.La confusión surge del hecho de que se utiliza el mismo nombre (nulo) para ambos conceptos.
Otros consejos
En VB6 la expresión Null = Null
Producirá Null
en lugar de True
como era de esperar.Esto causará un error de tiempo de ejecución si intenta asignarlo a un booleano, sin embargo, si lo usa como condición de "If ... Then
"Actuará como False
.Además Null <> Null
voluntad tambiénproducir Null
, entonces:
En VB6 se podría decir eso Null
¡No es igual a sí mismo (ni a ninguna otra cosa), ni desigual!
Se supone que debes probarlo usando el IsNull()
función.
VB6 también tiene otros valores especiales:
Nothing
para referencias de objetos.Nothing = Nothing
es un error de compilación.(se supone que debes compararlo usando "is
")Missing
para parámetros opcionales que no se han proporcionado.No tiene representación literal por lo que ni siquiera puedes escribir.Missing = Missing
.(la prueba esIsMissing(foo)
)Empty
para variables no inicializadas.Este prueba es igual a sí mismo aunque hay también Una funciónIsEmpty()
.- ...avísame si me he olvidado uno
Recuerdo estar un poco disgustado con VB.
Oráculo es por aquí.
SELECT * FROM dual WHERE NULL=null; --no rows returned
MySQL tiene un operador de igualdad seguro para nulos, <=>, que devuelve verdadero si ambos lados son iguales o ambos lados son nulos.Ver Documentos MySQL.
En C#, Nullable<bool> tiene propiedades interesantes con respecto a los operadores lógicos, pero el operador de igualdad es el mismo que otros tipos en ese lenguaje (es decir, ((bool?)null == (bool?)null) == true) .
Para preservar el en cortocircuito comportamiento de los operadores lógicos en cortocircuito y para preservar la coherencia con los operadores lógicos no en cortocircuito, el booleano anulable tiene algunas propiedades interesantes.Por ejemplo:Verdadero || nulo == Verdadero.falso && nulo == falso, etc.Esto está en directa contradicción con otros lenguajes lógicos de tres valores como ANSI-SQL.
Puedes hacer que Ruby funcione de esa manera:
class Null
def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null
En SQL tendrías que hacer algo como:
WHERE column is NULL
en vez de
WHERE column = NULL