Pergunta

Em quantas línguas Nulo não é igual a nada, nem mesmo Nulo?

Foi útil?

Solução

É assim no SQL (como uma linguagem lógica) porque nulo significa desconhecido/indefinido.

No entanto, em linguagens de programação (como C++ ou C#), um ponteiro/referência nulo é um valor específico com um significado específico - nada.

Dois nadas são equivalentes, mas duas incógnitas não.A confusão vem do fato de o mesmo nome (nulo) ser usado para ambos os conceitos.

Outras dicas

Em VB6 a expressão Null = Null vai produzir Null em vez de True como seria de esperar.Isso causará um erro de tempo de execução se você tentar atribuí -lo a um booleano, no entanto, se você o usar como a condição de "If ... Then"vai agir como False.Além disso Null <> Null vai tambémproduzir Null, então:

Em VB6 você poderia dizer isso Null não é igual a si mesmo (ou a qualquer outra coisa), nem desigual!

Você deveria testá-lo usando o IsNull() função.

VB6 também possui outros valores especiais:

  • Nothing para referências de objetos. Nothing = Nothing é um erro de compilação.(você deveria compará-lo usando "is")
  • Missing para parâmetros opcionais que não foram fornecidos.Não tem representação literal, então você nem consegue escrever Missing = Missing.(o teste é IsMissing(foo))
  • Empty para variáveis ​​não inicializadas.Este testa igual a si mesmo, embora haja também uma função IsEmpty().
  • ...deixe-me saber se eu esqueci algum

Lembro-me de ficar um pouco enojado com VB.

Oracle é assim.

SELECT * FROM dual WHERE NULL=null;  --no rows returned

O MySQL tem um operador de igualdade seguro para nulos, <=>, que retorna verdadeiro se ambos os lados forem iguais ou ambos os lados forem nulos.Ver Documentos MySQL.

Em C#, Nullable<bool> possui propriedades interessantes em relação aos operadores lógicos, mas o operador de igualdade é o mesmo que outros tipos nessa linguagem (ou seja, ((bool?)null == (bool?)null) == true) .

Para preservar o em curto-circuito comportamento dos operadores lógicos em curto-circuito e para preservar a consistência com os operadores lógicos sem curto-circuito, o booleano anulável tem algumas propriedades interessantes.Por exemplo:verdadeiro || null == true.falso && nulo == falso, etc.Isso está em contradição direta com outras linguagens lógicas de três valores, como SQL ANSI.

Você pode fazer o Ruby funcionar dessa maneira:

class Null
 def self.==(other);false;end
end
n=Null
print "Null equals nothing" if n!=Null

No SQL você teria que fazer algo como:

WHERE column is NULL

em vez de

WHERE column = NULL
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top