2009-11-03 7 views
6

私は誰もが考えるものが不思議です。 SQLでは(少なくともOracleでは)NULLは概念的に「私は値を知らない」という意味に変換されるので、NULL = NULLはfalseです。 (おそらく実際にNULLになってからfalseにキャストされるなど)...オブジェクトを比較するときにnullにする必要がありますか?

これは意味がありますが、ほとんどのオブジェクト指向言語ではnullは「参照なし」を意味するため、null == nullはおそらく本当だ。これは、Equalsをオーバーライドする場合など、C#での処理を行う通常の方法です。一方、nullは、オブジェクト指向言語で「わからない」という意味で頻繁に使用され、null == nullをfalseに実装すると、特定のドメインに対して若干意味のあるコードになる場合があります。

あなたの意見を教えてください。

+0

ええ、ここでOO言語で「わからない」という意味がありますか? 'null == null'が' false'を返すと、ヌルポインタをチェックする方法は? – hasen

答えて

3

私はすでに、IEEE NaNがそれ自身と同等ではないほど怒っています。私は==を同値関係として見る傾向があり、その性質の一つは反射性である。 "不明"な値の等価性を持つ特別なセマンティクスがある場合、セマンティクスがよく理解されている演算子にオーバーロードするのではなく、より具体的なものを使用する必要があると思います。たとえば、2つの値が等しいかどうかわからないからといって、それらが必ず等しくないわけではありません。つまり、==からのFalseの戻り値から推測することができます。あなたは本当にある種の三項論理を望んでいるようです。あなたの言語によっては、TrueまたはFalseまたはNoClueを返すことができる簡潔な== - 似たようなものを思いつくのは簡単かもしれませんが、別にするべきだと私は確信しています。

しかし問題についてちょうど私の意見:)

+0

それは本当に "私は知らない" == "私は知らない"は "私は知らない"、偽ではない - "私は知らない"から "偽"への変換は暗黙のうちにOKだと思われる。 –

+3

「True」、「False」、または「FileNotFound」を意味すると思います) –

8

私はJavaでヌルは、単にPythonでC++またはなしでNULLのように、特に「ここで何もない」という意味だと思います - ない「私は「ドンt know "と呼ばれ、OOP言語では一般的ではないSQL特有の概念です。

+0

私は同意します。コードでは、私たちはよくわかっているか、ヌルになっています - 何もありません。状態は有限で予測可能です。 –

10

汎用プログラミングでは、null == nullはおそらくtrueを返すべきです。

私は

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

パターンに私が実行した回数をカウントすることはできません、それはしばしば避けられないようです。 null == nullがfalseに評価された場合、このパターンは分割され、例外なくこのケースを処理する良い方法はありません。

+0

SQLには 'is'という特殊演算子があります。したがって、何かがNULLかどうかをテストするには、 'is NULL'を使用します。これはPythonの一般的な習慣でもありますが、==も使えます。 – gooli

+0

同様に、VB.NETには次のようなものがあります: 'Nothing' –

1

まずnull == nulltrueことは

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

仕事のようなパターンを作ります。 (はい、いつものテストはinstance != nullですが、私は!(null == null)falseであることの明確な使用を作りたい。)

第二に、あなたはinstance1instance2があなたのクラスのnull参照のインスタンスである場合にはfalseに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ポインタをnullとどのように比較しますか?

+0

C#では少なくとも正しい検査方法はobject.ReferenceEquals(null、variable) –

+0

です。これは' p == nullよりも優れていますか'? –

2

null === nullと言ったら、私はあなたに同意します。

+1

ええと、それは実際に良い点です。本当に良いポイント。 –

+0

'==='とは何ですか? – nawfal

0

C++:nullポインタを比較すると常にtrueが返されます。どういうわけかnull参照がある場合(そうしないでください)、結果はクラッシュします。

0

私の意見では、現在の動作は正しいです。特に、nullが "不明な値"として解釈されると考えると、

はそれについてこのように考える: 誰かが内容を知らなかった2つのボックス内のリンゴの数は同等であったかどうかを尋ねられた場合。答えは「はい」または「いいえ」ではなく、「わからない」となります。

+1

まさに、それはSQLのNULL機能の仕組みで、NULLと偽の間の暗黙のキャストがあります。 –

3

あなたはSQLについてのあなたの基本的な事実を完全に間違っていると思います。

NULLはデータ値であり、UNKNOWNは論理値です。

NULL = NULLは、UNKNOWNです。

NULL = NULLは確かにFALSEです!

Google for "three value logic"

NULLの値は、欠落しているデータ値のプレースホルダーです。理想的には、NULL対応可能な列は、一時的に欠落している値に対してのみ使用する必要があります。つまり、将来非NULLの値が使用可能になるという合理的な期待があります。終了日のNULLの値をDATETIMEの値のペアで使用すると、無期限を示す期間をモデル化するために使用されます。つまり、この期間は最新です(遠い将来のDATEITMEの値も有効ですが)。

+0

私はSQLの人ではないので、完全に可能です。私はほとんどoracleで動作し、oracleのNULL + anything = NULLとSELECTの1はDUALからNULL = NULLが0の行を返します。私はこれが "私には分からない"というのはnullの概念的定義なのだと読んでいます。 –

+0

あなたの防衛において、私は、Oracleが正しくNULLを実装していないのは正しいと思います。 IIRC、 '' [空文字列] IS NULLはOracleではTRUEですが、SQLではFALSEです。例えば、NULLはSQL DDLのために異なって扱われることに注意してください。 NULLに評価される行レベルのCHECK制約によって、「疑いの利益」のような更新が成功します。 – onedaywhen

関連する問題