Domanda

In quante lingue Null non è uguale a niente nemmeno a Null?

È stato utile?

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 scrivere Missing = Missing.(la prova è IsMissing(foo))
  • Empty per variabili non inizializzate.Questo test è uguale a se stesso anche se c'è Anche una funzione IsEmpty().
  • ...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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top