Language agnostic 比较对象时null==null是否应为true?

Language agnostic 比较对象时null==null是否应为true?,language-agnostic,oop,Language Agnostic,Oop,我很好奇大家怎么想。在SQL中(至少在oracle中),NULL在概念上转换为“我不知道值”,因此NULL=NULL为false。(可能它实际上会导致一个NULL,然后被转换为false或类似的东西…) 这对我来说是有意义的,但在大多数OO语言中,null表示“无引用”,因此null==null应该是真的。这是C#中通常的做法,例如,当覆盖Equals时 另一方面,在面向对象语言中,null仍然经常用来表示“我不知道”,实现null==null到false可能会导致代码对某些域更有意义 告诉我你

我很好奇大家怎么想。在SQL中(至少在oracle中),NULL在概念上转换为“我不知道值”,因此NULL=NULL为false。(可能它实际上会导致一个NULL,然后被转换为false或类似的东西…)

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

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


告诉我你的想法。

我已经对IEEE NaN的不平等感到非常恼火。我倾向于将==视为一种等价关系,其特性之一是自反性。如果你有“未知”值相等的特殊语义,我认为你应该使用更具体的东西,而不是重载一个语义很好理解的操作符。例如,仅仅因为您不知道两个值是否相等,并不意味着它们肯定不相等,这就是我从==的假返回值中猜测的。看起来你真的需要某种三元逻辑。取决于你的语言,你可能会也可能不会很容易想出一个简洁的==-相似的,可以返回真或假或非蓝色,但我肯定认为它应该是分开的


我认为,爪哇中的NULL,就像C++中的null或Python中的No.5,都是指“这里什么都没有”——不是“我不知道”,这是SQL特有的概念,在OOP语言中不常见。

< P>对于通用编程,NULL= NULL应该可能返回true。 我数不清我遇到过多少次了

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

这似乎是不可避免的。如果null==null的计算结果为false,则此模式将崩溃,并且没有一个好的方法可以毫无例外地处理此情况。

首先
null==null
true
使模式类似

if(!(instance == null)) {
    // do something requiring instance not be null
}
工作。(是的,通常的测试是
instance!=null
,但我想说明
!(null==null)
的用法是
false

其次,如果当
instance1
instance2
是类的空引用实例时,需要将
instance1==instance2
设置为false,那么应该将其封装到某个逻辑类中。在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
    }
}
类MyObjectComparer:IEqulityComparer{
公共布尔等于(MyObject实例1,MyObject实例2){
如果(instance1==null&&instance2==null){
返回false;
}
//这里的逻辑
}
public int GetHashCode(MyObject实例){
//这里的逻辑
}
}
所有空指针(或引用)彼此相等


它们必须是,否则您如何将空指针与
null
进行比较?

如果您说
null===null
,我同意您的说法。

C++:比较空指针总是返回true。如果你有一个空引用(不要这样做),结果就是崩溃。我认为,当前行为是正确的,尤其是如果你认为NULL被解释为“未知值”。p> 这样想:
如果有人问你不知道两个盒子里的苹果数量是否相等。答案不是肯定或否定,而是“我不知道。”

我认为您对SQL的基本认识是完全错误的

NULL
是数据值,
UNKNOWN
是逻辑值

NULL=NULL
未知的

NULL=NULL
当然不是
FALSE

谷歌的“三值逻辑”


NULL
值是缺少数据值的占位符。理想的,
NULL
-able列应仅用于暂时缺失的值,即,合理预期非
NULL
值将在未来可用,例如,在一对
DATETIME
值中使用
NULL
值作为结束日期,用于建模表示无限的期间,即。这段时间是当前的(尽管在遥远的将来,
datetime
value也很有效)。

我同意。在代码中,我们通常知道我们有或得到空值-无。状态是有限的和可预测的。这是真的,“我不知道”==“我不知道”应该导致“我不知道”,而不是错误-虽然从“我不知道”转换为错误隐式似乎是可以的。我想你的意思是
true
false
,或者
FileNotFound
;)在C#中,至少进行空检查的正确方法是object。ReferenceEquals(空,变量)这比
p==null
更好(或不同)?嗯,这实际上是一个很好的观点。这是一个非常好的观点。呃,在OO语言中,null在哪里表示“我不知道”?如果
null==null
返回
false
,您将如何检查null指针?确切地说,这就是null在SQL中的工作方式,在null和false之间有一个隐式转换在SQL中有一个特殊的操作符叫做“is”。因此,要测试某个内容是否为NULL,请使用“is NULL”。这也是Python中的常见做法,尽管==也有效。类似地,在VB.NET中,您有:
什么都不是
我不是SQL高手,所以这是完全可能的。我主要使用oracle,在OracleNull+anything=NULL中,从DUAL中选择1,其中NULL=NULL返回0行。我读到这篇文章是因为“我不知道”是null的概念性定义。为您辩护,我认为Oracle确实没有正确地实现null。IIRC,“[empty string]为NULL”对于Oracle为TRUE,而在SQL中为FALSE。请注意,对于SQL DDL,NULL的处理方式不同,例如行级检查