比较对象时,null == null是否为真?

时间:2009-11-03 02:47:44

标签: language-agnostic oop

我很好奇每个人的想法。在SQL中(至少在oracle中),NULL在概念上转换为“我不知道值”,因此NULL = NULL为false。 (也许它实际上导致NULL然后被转换为false或类似的东西......)

这对我来说很有意义,但在大多数OO语言中,null表示“无引用”,因此null == null应该是真的。这是在C#中执行操作的常用方法,例如在覆盖Equals时。

另一方面,null仍然经常用于表示面向对象语言中的“我不知道”,将null == null实现为false可能会导致代码对某些域更有意义。

告诉我你的想法。

9 个答案:

答案 0 :(得分:10)

对于通用编程,null == null应该返回true。

我无法计算我遇到

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

模式,它似乎经常是不可避免的。如果将null == null计算为false,则此模式将崩溃,并且没有一种很好的方法可以在没有异常的情况下处理此情况。

答案 1 :(得分:8)

我认为Java中的null,就像C ++中的NULL或Python中的None一样,意味着“这里没有任何东西” - “我不知道”,这是一个特殊的概念到SQL,在OOP语言中不常见。

答案 2 :(得分:3)

我已经厌倦了IEEE NaN不等于自己。我倾向于将==视为等价关系,其属性之一是反身性。如果你有“未知”值相等的特殊语义,我认为你应该使用更具体的东西,而不是重载一个语义很好理解的运算符。例如,仅仅因为你不知道两个值是否相等,并不意味着它们肯定不相等,这就是我从==的假返回值中猜出的。看起来你真的想要某种三元逻辑。根据您的语言,您可能会或者可能不容易想出一个简洁的== - 相似的可以返回真或假或NoClue,但我绝对认为它应该是分开的。

我对此事的意见虽然:)

答案 3 :(得分:3)

我认为你已经完全错误地了解了关于SQL的基本事实。

NULL是数据值,UNKNOWN是逻辑值。

NULL = NULLUNKNOWN

NULL = NULL当然不是FALSE

谷歌的“三价值逻辑”。

NULL值是缺少数据值的占位符。理想情况下,只有NULL能够使用的列才能用于仅暂时丢失的值,即合理预期将来可能会使用非NULL值,例如使用NULL值作为结束日期的DATETIME值,用于模拟句点以表示无穷大,即此期间是最新的(尽管远期DATEITME值也适用)。

答案 4 :(得分:2)

如果你说null === null,我会同意你的看法。

答案 5 :(得分:1)

首先null == nulltrue会产生类似

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

的工作。 (是的,通常的测试是instance != null,但我想明确使用!(null == null) false。)

其次,如果instance1 == instance2instance1是类的空引用实例时需要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
    }
}

答案 6 :(得分:0)

所有空指针(或引用)彼此相等。

他们,否则你如何将空指针与null进行比较?

答案 7 :(得分:0)

C ++:比较空指针总是返回true。如果你有一个空引用(不要这样做),结果就会崩溃。

答案 8 :(得分:0)

在我看来,当前行为是正确的,特别是如果您认为null被解释为“未知值”。

以这种方式思考: 如果有人问你两个盒子里面的苹果数量是不是你所知道的内容相等。答案不是肯定或否定,而是“我不知道。”