2009-11-03 15 views
6

Tengo curiosidad por lo que todos piensan. En SQL (al menos en Oracle) NULL se traduce conceptualmente a "No sé el valor", por lo que NULL = NULL es falso. (Tal vez realmente da como resultado un NULO que luego se convierte en falso o algo así ...)¿Debe null == null ser verdadero al comparar objetos?

Esto tiene sentido para mí, pero en la mayoría de los lenguajes de OO null significa "sin referencia", por lo que nulo == nulo probablemente ser cierto. Esta es la forma habitual de hacer las cosas en C#, por ejemplo, al anular Iguales.

Por otro lado, null todavía se usa con frecuencia para significar "No sé" en lenguajes orientados a objetos y la implementación de null == null como falso podría dar como resultado un código que es ligeramente más significativo para ciertos dominios.

Dime lo que piensas.

+0

eh, donde null alguna vez significa "No sé" en un idioma OO? ¿Y cómo comprobaría los punteros nulos si 'null == null' devolvía' false'? – hasen

Respuesta

3

Ya me enojo lo suficiente en el IEEE NaN al no ser igual a sí mismo. Tiendo a ver == como una relación de equivalencia, una de cuyas propiedades es la reflexividad. Si tiene una semántica especial de igualdad de valores "desconocidos", creo que debería usar algo más específico en lugar de sobrecargar a un operador cuya semántica es bien comprendida. Por ejemplo, el hecho de que no sepas si dos valores son iguales no significa que definitivamente no sean iguales, que es lo que supongo de un valor de retorno falso de ==. Parece que realmente quieres algún tipo de lógica ternaria. Dependiendo de su idioma, puede o no puede ser fácil para usted encontrar un conciso == - que pueda devolver verdadero o falso o NoClue, pero definitivamente creo que debería estar separado.

Sólo mi opinión sobre el asunto aunque :)

+0

Eso es cierto, "No sé" == "No sé" debería dar como resultado "No sé", no es falso, aunque la conversión de "No sé" a falso implícitamente parece estar bien. –

+3

Creo que te refieres a 'True',' False', o 'FileNotFound';) –

8

creo que nula en Java, al igual que NULL en C++ o Nada en Python, significa específicamente "no hay nada aquí" - no "I don' t know ", que es un concepto peculiar de SQL, no es común en los lenguajes de OOP.

+0

Estoy de acuerdo. En el código, a menudo SABEMOS que tenemos o obtenemos nulo, nada. El estado es finito y predecible. –

10

Para programación de propósito general, null == null probablemente debería ser verdadero.

No puedo contar el número de veces que me he encontrado con el patrón

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

, y que a menudo parece inevitable. Si null == null evaluado como falso, este patrón se derrumbaría, y no habría una buena manera de manejar este caso sin excepciones.

+0

En SQL hay un operador especial para el llamado 'es'. Entonces para probar si algo es NULL usa 'es NULL'. Esa es también la práctica común en Python, aunque == también funciona. – gooli

+0

Del mismo modo, en VB.NET tiene: 'Es nada' –

1

Primera null == null siendo true hace patrones como

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

trabajo. (Sí, la prueba usual es instance != null pero quiero dejar en claro el uso de !(null == null) siendo false.)

En segundo lugar, si necesita instance1 == instance2 ser falsa cuando instance1 y instance2 son ejemplos de referencia nulos de su clase, entonces esto debe ser encapsulado en una clase lógica en alguna parte. En C#, diríamos

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

Todos los punteros nulos (o referencias) son iguales entre sí.

tienen ser, de lo contrario, ¿cómo compararía un puntero nulo a null?

+0

Bueno en C# al menos la forma correcta de hacer comprobaciones nulas es object.ReferenceEquals (nulo, variable) –

+0

¿Es esto mejor (o diferente) que' p == null ¿? –

2

Si dijo null === null, estoy de acuerdo con usted.

+1

Hmm, eso es un buen punto en realidad. Un muy buen punto. –

+0

¿Qué es '==='? – nawfal

0

C++: la comparación de punteros nulos siempre devuelve verdadero. Si de alguna manera tiene una referencia nula (no lo haga), el resultado es un bloqueo.

0

En mi opinión, el comportamiento actual es correcto, especialmente si se considera que null se interpreta como "Valor desconocido".

pensar de esta manera: Si alguien le preguntó si el número de manzanas dentro de dos cajas que usted no conoce el contenido del eran iguales. La respuesta no sería sí o no, sería "No sé".

+1

Exactamente, y esa es la forma en que funciona NULL en SQL, solo hay un elenco implícito entre NULL y falso –

3

Creo que tiene sus datos básicos sobre SQL completamente equivocados.

NULL es un valor de datos y UNKNOWN es un valor lógico.

NULL = NULL es UNKNOWN.

NULL = NULL ciertamente no es FALSE!

Google para "tres valores lógicos".

El valor NULL es el marcador de posición para un valor de datos faltante. Idealmente, una columna de NULL solo se debe usar para valores que solo faltan temporalmente, es decir, existe una expectativa razonable de que un valor que no sea NULL estará disponible en el futuro, p. utilizando el valor NULL para la fecha de finalización en un par de DATETIME valores utilizados para modelar un período para indicar infinito, es decir, este período es actual (aunque un valor futuro lejano DATEITME también funciona bien).

+0

No soy un tipo SQL así que eso es totalmente posible. Trabajo principalmente con Oracle y en Oracle NULL + anything = NULL y SELECT 1 de DUAL WHERE NULL = NULL devuelve 0 filas. He leído que esto se debe a que "No sé" es la definición conceptual de nulo. –

+0

En su defensa, creo que es cierto que Oracle no implementa NULL correctamente. IIRC, '' [cadena vacía] IS NULL es VERDADERO para Oracle, mientras que en SQL es FALSE. Tenga en cuenta que NULL se trata de manera diferente para SQL DDL, por ejemplo. una restricción CHECK de nivel de fila que se evalúa como NULL permite que la actualización tenga éxito, una especie de efecto de 'beneficio de la duda'. – onedaywhen

Cuestiones relacionadas