2009-11-03 13 views
6

Sono curioso di sapere cosa pensano tutti. In SQL (almeno in oracle) NULL traduce concettualmente in "Non conosco il valore", quindi NULL = NULL è falso. (Forse in realtà risulta in un NULL che poi viene castato in falso o qualcosa del genere ...)Il valore null == null è vero quando si confrontano gli oggetti?

Questo ha senso per me, ma nella maggior parte dei linguaggi OO null significa "nessun riferimento" quindi null == null dovrebbe probabilmente essere vero. Questo è il solito modo di fare cose in C#, ad esempio quando si esegue l'override di Equals.

D'altra parte, null è ancora utilizzato frequentemente per significare "Non so" in linguaggi orientati agli oggetti e l'implementazione di null == null su false potrebbe comportare un codice leggermente più significativo per determinati domini.

Dimmi cosa ne pensi.

+0

eh, dove nient mai significa "non so" in un linguaggio OO? E come controllereste i puntatori nulli se 'null == null' ha restituito' false'? – hasen

risposta

3

Sono già abbastanza infastidito dal fatto che IEEE NaN non sia uguale a se stesso. Tendo a visualizzare == come una relazione di equivalenza, una delle cui proprietà è la riflessività. Se hai una semantica speciale di uguaglianza del valore "sconosciuto", penso che dovresti usare qualcosa di più specifico piuttosto che sovraccaricare un operatore la cui semantica è ben compresa. Ad esempio, solo perché non sai se due valori sono uguali, non significa che sicuramente non sono uguali, che è quello che immagino da un valore di ritorno False da ==. Sembra che tu voglia davvero una sorta di logica ternaria. A seconda della tua lingua, potrebbe essere semplice o meno per te trovare un conciso == - allo stesso modo che può restituire True o False o NoClue, ma penso che debba essere separato.

Appena il mio parere sulla questione però :)

+0

È vero, "Non so" == "Non so" dovrebbe risultare in "Non so", non falso - sebbene la conversione da "Non so" a falso implicitamente sembra ok. –

+3

Penso che tu intenda "Vero", "Falso" o "FileNotFound";) –

8

penso che nulla in Java, proprio come NULL in C++ o None in Python, significa in particolare "qui non c'è niente" - non "I don' t know ", che è un concetto peculiare di SQL, non comune nei linguaggi OOP.

+0

Sono d'accordo. Nel codice, spesso sappiamo che abbiamo o riceviamo nulla - niente. Lo stato è finito e prevedibile. –

10

Per la programmazione generica, null == null dovrebbe probabilmente restituire true.

Non riesco a contare il numero di volte che ho incontrato il modello

if(obj != null) 
{ 
    //call methods on obj 
} 

, e sembra spesso inevitabile. Se null == null è stato valutato come falso, questo modello andrebbe a pezzi e non ci sarebbe un buon modo per gestire questo caso senza eccezioni.

+0

In SQL c'è un operatore speciale per quello chiamato 'è'. Quindi per verificare se qualcosa è NULL usi 'è NULL'. Questa è anche la pratica comune in Python, sebbene anche == funzioni. – gooli

+0

Analogamente, in VB.NET si ha: 'Niente' –

1

Prima null == null essere true rende modelli come

if(!(instance == null)) { 
    // do something requiring instance not be null 
} 

lavoro. (Sì, la solita prova è instance != null ma voglio mettere in chiaro l'uso di !(null == null) essere false.)

In secondo luogo, se è necessario instance1 == instance2 di essere falsa quando instance1 e instance2 sono casi riferimento null della vostra classe, allora questo dovrebbe essere incapsulato in una classe logica da qualche parte. In C#, diremmo

class MyObjectComparer : IEqulityComparer<MyObject> { 
    public bool Equals(MyObject instance1, MyObject instances2) { 
     if(instance1 == null && instance2 == null) { 
      return false; 
     } 
     // logic here 
    } 

    public int GetHashCode(MyObject instance) { 
     // logic here 
    } 
} 
0

Tutti i puntatori nulli (o riferimenti) sono uguali tra loro.

Essi hanno essere, altrimenti come si confronta un puntatore nullo a null?

+0

Bene in C# almeno il modo corretto di fare controlli nulli è object.ReferenceEquals (null, variabile) –

+0

È meglio (o diverso) di' p == null '? –

2

Se hai detto null === null, sarei d'accordo con te.

+1

Hmm, questo è davvero un buon punto. Davvero un bel punto. –

+0

cos'è '==='? – nawfal

0

C++: il confronto dei puntatori nulli restituisce sempre true. Se in qualche modo hai un riferimento null (non farlo) il risultato è crash.

0

A mio parere il comportamento corrente è corretto, soprattutto se si considera che null viene interpretato come "Valore sconosciuto".

pensare in questo modo: Se qualcuno ti ha chiesto se il numero di mele all'interno di due scatole che non sapevi il contenuto di fosse uguale. La risposta non sarebbe sì o no, sarebbe "non lo so".

+1

Esattamente, e questo è il modo in cui funziona NULL in SQL, c'è solo un cast implicito tra NULL e false –

3

Penso che tu abbia i tuoi dati di base su SQL completamente sbagliato.

NULL è un valore di dati e UNKNOWN è un valore logico.

NULL = NULL è UNKNOWN.

NULL = NULL non è certamente FALSE!

Google per "logica a tre valori".

Il valore NULL è il segnaposto per un valore di dati mancante. Idealmente, una colonna di tipo NULL deve essere utilizzata solo per valori che mancano solo temporaneamente, quindi c'è una ragionevole aspettativa che un valore non NULL sarà disponibile in futuro, ad es. utilizzando il valore NULL per la data di fine in una coppia di valori DATETIME utilizzati per modellare un periodo per indicare l'infinito, vale a dire che questo periodo è corrente (anche se un valore di futuro DATEITME funziona bene).

+0

Non sono un ragazzo SQL, quindi è totalmente possibile. Lavoro principalmente con oracle e in oracle NULL + anything = NULL e SELECT 1 da DUAL WHERE NULL = NULL restituisce 0 righe. Ho letto che questo è perché "non so" è la definizione concettuale di null. –

+0

In tua difesa, penso sia vero che Oracle non implementa NULL correttamente. IIRC, '' [stringa vuota] IS NULL è TRUE per Oracle, mentre in SQL è FALSE. Si noti che NULL è trattato in modo diverso per SQL DDL, ad es. un vincolo CHECK a livello di riga che valuta NULL consente il corretto aggiornamento, una sorta di effetto "beneficio del dubbio". – onedaywhen

Problemi correlati