2009-11-03 5 views
6

Мне любопытно, что все думают. В SQL (по крайней мере, в oracle) NULL трансформирует концептуально в «Я не знаю значения», поэтому NULL = NULL является ложным. (Может быть, это на самом деле приводит к NULL, который затем получает значение false или что-то в этом роде ...)Должно ли null == null быть истинным при сравнении объектов?

Это имеет смысл для меня, но в большинстве языков OO значение null означает «no reference», поэтому null == null должно, вероятно, будь настоящим. Это обычный способ делать вещи в C#, например, при переопределении Equals.

С другой стороны, значение null по-прежнему часто используется для обозначения «Я не знаю» в объектно-ориентированных языках, а реализация null == null в false может привести к тому, что код несколько более значим для определенных доменов.

Скажите, что вы думаете.

+0

eh, где null означает «Я не знаю» на языке OO? И как бы вы проверили нулевые указатели, если 'null == null' вернули' false'? – hasen

ответ

3

Я уже достаточно разозлился на IEEE NaN, не будучи равным себе. Я склонен рассматривать == как отношение эквивалентности, одним из свойств которого является рефлексивность. Если у вас есть специальная семантика «неизвестного» значения равенства, я думаю, вы должны использовать что-то более конкретное, а не перегружать оператора, семантика которого хорошо понята. Например, только потому, что вы не знаете, являются ли два значения равными, это не означает, что они определенно не равны, что я бы предположил из значения False return from ==. Кажется, вам действительно нужна какая-то тройственная логика. В зависимости от вашего языка вам может быть или нелегко придумать краткое == - подобное, которое может вернуть True или False или NoClue, но я определенно считаю, что он должен быть отдельным.

Просто мое мнение по этому вопросу, хотя :)

+0

Thats true, «Я не знаю» == «Я не знаю» должен приводить к «Я не знаю», а не false - хотя преобразование из «Я не знаю» в false неявно выглядит нормально. –

+3

Я думаю, что вы имеете в виду 'True',' False' или 'FileNotFound';) –

8

Я думаю, что нуль в Java, так же, как NULL в C++ или None в Python, значит, в частности, «нет ничего здесь» - не «Я не» t know ", что является концепцией, характерной для SQL, не распространенной в языках ООП.

+0

Согласен. В коде мы часто ЗНАЕМ, что имеем или получаем нуль - ничего. Состояние конечное и предсказуемое. –

10

Для программирования общего назначения null == null, вероятно, должен возвращать значение true.

Я не могу сосчитать, сколько раз я запустить в шаблон

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

, и часто кажется неизбежным. Если null == null вычисляется как false, этот шаблон будет разваливаться, и не было бы хорошего способа справиться с этим случаем без исключений.

+0

В SQL есть специальный оператор для вызова 'is'. Поэтому, чтобы проверить, что что-то NULL, вы используете «NULL». Это также обычная практика в Python, хотя == также работает. – gooli

+0

Аналогичным образом, в VB.NET у вас есть: 'Is Nothing' –

1

Первый null == null быть true делает модели как

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

работы. (Да, обычный тест instance != null, но я хочу, чтобы сделать четкое использование !(null == null) быть false.)

Во-вторых, если вам нужно instance1 == instance2 быть ложным, когда instance1 и instance2 нулевые ссылки на экземпляры своего класса, то это должно где-то инкапсулируется в логический класс. В C# мы бы сказали, что

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

Все нулевые указатели (или ссылки) равны друг другу.

У них есть быть, иначе как бы вы сравнили нулевой указатель на null?

+0

Ну, в C#, по крайней мере, правильный способ выполнения нулевых проверок - object.ReferenceEquals (null, variable) –

+0

Является ли это лучше (или отличается), чем' p == null '? –

2

Если вы сказали null === null, я согласен с вами.

+1

Хм, это хорошая точка на самом деле. Действительно действительно хороший момент. –

+0

Что такое '==='? – nawfal

0

C++: сравнение нулевых указателей всегда возвращает true. Если у вас есть нулевая ссылка (не делайте этого), результат будет аварийным.

0

По-моему, текущее поведение является правильным, особенно если вы считаете, что значение null интерпретируется как «Неизвестное значение».

Подумайте об этом так: Если кто-то спросил вас ли количество яблок в двух коробках, которые вы не знали, содержание были равны. Ответ был бы не «да» или «нет», это было бы «я не знаю».

+1

Точно так же, как работает NULL в SQL, есть только неявный бросок между NULL и false –

3

Я думаю, что у вас есть свои основные факты о том, что SQL совершенно неверен.

NULL - значение данных, а UNKNOWN - логическое значение.

NULL = NULL является UNKNOWN.

NULL = NULL, конечно, не FALSE!

Google для «трехзначной логики».

Значение NULL является заполнителем для отсутствующего значения данных. В идеале, столбец NULL -able должен использоваться только для значений, которые временно отсутствуют, т. Е. Существует разумное ожидание того, что в будущем будет доступно значение не NULL, например. используя значение NULL для даты окончания в паре значений DATETIME, используемых для моделирования периода для обозначения бесконечности, то есть этот период является текущим (хотя значение далекого будущего DATEITME тоже хорошо работает).

+0

Я не парень SQL, так что это вполне возможно. Я работаю в основном с oracle и в oracle NULL + anything = NULL и SELECT 1 из DUAL WHERE NULL = NULL возвращает 0 строк. Я читал, что это потому, что «я не знаю» - это концептуальное определение null. –

+0

В вашей защите, я думаю, это правда, что Oracle не реализует NULL правильно. IIRC, '' [пустая строка] IS NULL имеет значение TRUE для Oracle, тогда как в SQL это FALSE. Обратите внимание, что NULL обрабатывается по-разному для SQL DDL, например. ограничение CHECK на уровне строки, которое оценивает значение NULL, позволяет обновлению добиться успеха, что-то вроде эффекта «выгоды от сомнений». – onedaywhen

Смежные вопросы