In quante lingue Null non è uguale a niente nemmeno a Null?
-
09-06-2019 - |
Domanda
In quante lingue Null non è uguale a niente nemmeno a Null?
Soluzione
È così in SQL (come linguaggio logico) perché null significa sconosciuto/non definito.
Tuttavia, nei linguaggi di programmazione (come ad esempio C++ o C#), un puntatore/riferimento nullo è un valore specifico con un significato specifico: niente.
Due nulla sono equivalenti, ma due incognite no.La confusione deriva dal fatto che per entrambi i concetti viene utilizzato lo stesso nome (null).
Altri suggerimenti
In VB6 l'espressione Null = Null
produrrà Null
invece di True
come ti aspetteresti.Ciò causerà un errore di runtime se si tenta di assegnarlo a un booleano, tuttavia se lo usi come condizione di "If ... Then
" si comporterà come False
.Inoltre Null <> Null
Volere Ancheprodurre Null
, COSÌ:
In VB6 potresti dirlo Null
non è né uguale a se stesso (o qualsiasi altra cosa), né disuguale!
Dovresti testarlo usando il file IsNull()
funzione.
VB6 ha anche altri valori speciali:
Nothing
per i riferimenti agli oggetti.Nothing = Nothing
è un errore di compilazione.(dovresti confrontarlo usando "is
")Missing
per i parametri opzionali che non sono stati forniti.Non ha una rappresentazione letterale quindi non puoi nemmeno scrivereMissing = Missing
.(la prova èIsMissing(foo)
)Empty
per variabili non inizializzate.Questo test è uguale a se stesso anche se c'è Anche una funzioneIsEmpty()
.- ...fatemi sapere se ne ho dimenticato uno
Ricordo di essere stato un po' disgustato da VB.
Oracle è così.
SELECT * FROM dual WHERE NULL=null; --no rows returned
MySQL ha un operatore di uguaglianza null-safe, <=>, che restituisce vero se entrambi i lati sono uguali o entrambi i lati sono nulli.Vedere Documenti MySQL.
In C#, Nullable<bool> ha proprietà interessanti rispetto agli operatori logici, ma l'operatore di uguaglianza è lo stesso di altri tipi in quel linguaggio (ad esempio, ((bool?)null == (bool?)null) == true) .
Per preservare il cortocircuitato comportamento degli operatori logici cortocircuitati e per preservare la coerenza con gli operatori logici non cortocircuitati, il valore booleano nullable ha alcune proprietà interessanti.Per esempio:vero || null == vero.false && null == false, ecc.Ciò è in diretta contraddizione con altri linguaggi logici a tre valori come ANSISQL.
Puoi far funzionare Ruby in questo modo:
class Null
def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null
In SQL dovresti fare qualcosa del tipo:
WHERE column is NULL
piuttosto che
WHERE column = NULL