我很好奇每个人的想法。在SQL中(至少在oracle中),NULL在概念上转换为“我不知道值”,因此NULL = NULL为false。 (也许它实际上导致NULL然后被转换为false或类似的东西......)
这对我来说很有意义,但在大多数OO语言中,null表示“无引用”,因此null == null应该是真的。这是在C#中执行操作的常用方法,例如在覆盖Equals时。
另一方面,null仍然经常用于表示面向对象语言中的“我不知道”,将null == null实现为false可能会导致代码对某些域更有意义。
告诉我你的想法。
答案 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 = NULL
是UNKNOWN
。
NULL = NULL
当然不是FALSE
!
谷歌的“三价值逻辑”。
NULL
值是缺少数据值的占位符。理想情况下,只有NULL
能够使用的列才能用于仅暂时丢失的值,即合理预期将来可能会使用非NULL
值,例如使用NULL
值作为结束日期的DATETIME
值,用于模拟句点以表示无穷大,即此期间是最新的(尽管远期DATEITME
值也适用)。
答案 4 :(得分:2)
如果你说null === null
,我会同意你的看法。
答案 5 :(得分: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
}
}
答案 6 :(得分:0)
所有空指针(或引用)彼此相等。
他们有,否则你如何将空指针与null
进行比较?
答案 7 :(得分:0)
C ++:比较空指针总是返回true。如果你有一个空引用(不要这样做),结果就会崩溃。
答案 8 :(得分:0)
在我看来,当前行为是正确的,特别是如果您认为null被解释为“未知值”。
以这种方式思考: 如果有人问你两个盒子里面的苹果数量是不是你所知道的内容相等。答案不是肯定或否定,而是“我不知道。”