2009-11-03 23 views
6

मैं उत्सुक हूं कि हर कोई क्या सोचता है। एसक्यूएल में (कम से कम ऑरैकल में) न्यूल "अवधारणा को नहीं जानता" के लिए अवधारणात्मक रूप से अनुवाद करता है ताकि न्यूल = नल झूठा हो। (हो सकता है कि यह वास्तव में एक नल में परिणाम देता है जो तब झूठ या कुछ ऐसा हो जाता है ...)वस्तुओं की तुलना करते समय शून्य == शून्य सही होना चाहिए?

यह मुझे समझ में आता है, लेकिन ज्यादातर ओओ भाषाओं में शून्य का अर्थ है "कोई संदर्भ नहीं" तो शून्य == शून्य सच हो। सी # में चीजों को करने का यह सामान्य तरीका है उदाहरण के लिए बराबर ओवरराइड करते समय।

दूसरी तरफ, ऑब्जेक्ट उन्मुख भाषाओं में "मुझे नहीं पता" और शून्य के लिए शून्य == नल लागू करने के लिए शून्य का उपयोग अक्सर किया जाता है जिसके परिणामस्वरूप कुछ डोमेन के लिए थोड़ा अधिक सार्थक हो सकता है।

मुझे बताएं कि आप क्या सोचते हैं।

+0

एह, ओओ भाषा में कभी भी "मुझे नहीं पता" का अर्थ क्या है? और यदि आप 'null == null'' false' लौटाए हैं तो आप नल पॉइंटर्स की जांच कैसे करेंगे? – hasen

उत्तर

3

मैं पहले से ही आईईईई नाइन में पर्याप्त नाराज हो गया हूं जो स्वयं के बराबर नहीं है। मैं == को समकक्ष संबंध के रूप में देखना चाहता हूं, जिनमें से एक गुण रिफ्लेक्सिविटी है। यदि आपके पास "अज्ञात" मान समानता के विशेष अर्थशास्त्र हैं, तो मुझे लगता है कि आपको ऑपरेटर को अधिभारित करने के बजाय कुछ और विशिष्ट उपयोग करना चाहिए जिसका अर्थशास्त्र अच्छी तरह से समझा जाता है। उदाहरण के लिए, सिर्फ इसलिए कि आप नहीं जानते कि दो मान बराबर हैं, इसका मतलब यह नहीं है कि वे निश्चित रूप से बराबर नहीं हैं, जो कि मैं == से झूठी वापसी मान से अनुमान लगाता हूं। ऐसा लगता है कि आप वास्तव में कुछ प्रकार के टर्नरी तर्क चाहते हैं। आपकी भाषा के आधार पर, आपके लिए एक संक्षिप्त == के साथ आने के लिए आसान हो सकता है या नहीं - जैसा कि सही या गलत या NoClue वापस कर सकता है, लेकिन मुझे निश्चित रूप से लगता है कि यह अलग होना चाहिए।

बस हालांकि बात :)

+0

सच है, "मुझे नहीं पता" == "मुझे नहीं पता" परिणामस्वरूप "मुझे नहीं पता", झूठ नहीं होना चाहिए - हालांकि झूठ बोलने के लिए "मुझे नहीं पता" से कनवर्ट करना ठीक लगता है। –

+3

मुझे लगता है कि आपका मतलब है 'ट्रू', 'गलत', या 'फ़ाइल नॉटफाउंड';) –

8

पर मेरी राय मैं जावा में है कि रिक्त लगता है, बस पायथन में सी में शून्य ++ या कोई नहीं की तरह है, विशेष रूप से मतलब है "यहां कुछ भी नहीं है" - नहीं "मैं डॉन ' टी पता ", जो एसक्यूएल के लिए विशिष्ट है, ओओपी भाषाओं में आम नहीं है।

+0

मैं सहमत हूं। कोड में, हम अक्सर जानते हैं कि हमारे पास शून्य है या कुछ भी नहीं है। राज्य सीमित और अनुमानित है। –

10

सामान्य उद्देश्य प्रोग्रामिंग के लिए, शून्य == शून्य संभवतः सत्य वापस आना चाहिए।

मैं

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

स्वरूप में बार मैंने दौड़े हैं की संख्या की गणना नहीं कर सकते हैं, और यह अक्सर अपरिहार्य लगता है। यदि शून्य == नल का गलत मूल्यांकन किया गया है, तो यह पैटर्न अलग हो जाएगा, और अपवादों के बिना इस मामले को संभालने का कोई अच्छा तरीका नहीं होगा।

+0

एसक्यूएल में 'is' नामक एक विशेष ऑपरेटर है। तो परीक्षण करने के लिए यदि कुछ शून्य है तो आप 'नल' का उपयोग करते हैं। यह पायथन में भी सामान्य प्रथा है, हालांकि == भी काम करता है। – gooli

+0

इसी प्रकार, वीबी.नेट में आपके पास है: 'कुछ भी नहीं' –

1

पहले null == nulltrue होने जैसा

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

काम पैटर्न बना देता है। यदि आप instance1 == instance2 जरूरत है गलत जब instance1 और instance2 अपने वर्ग के रिक्त संदर्भ उदाहरण हैं (हाँ, सामान्य परीक्षण instance != null है, लेकिन मैं स्पष्ट !(null == null) जा रहा है false का उपयोग करना चाहते हैं।)

दूसरा,, तो यह चाहिए कहीं एक तर्क वर्ग में encapsulated हो। सी # में, हम कहेंगे

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

सी # में कम से कम शून्य जांच करने का सही तरीका ऑब्जेक्ट है। संदर्भ Equals (शून्य, चर) –

+0

क्या यह बेहतर है (या अलग) 'p == null '? –

2

यदि आपने null === null कहा, तो मैं आपसे सहमत हूं।

+1

हम्म, वास्तव में यह एक अच्छा बिंदु है। वास्तव में वास्तव में एक अच्छा मुद्दा है। –

+0

'===' क्या है? – nawfal

0

सी ++: शून्य पॉइंटर्स की तुलना करना हमेशा सत्य देता है। यदि किसी भी तरह आपके पास शून्य संदर्भ है (ऐसा न करें) परिणाम क्रैश है।

0

मेरी राय में वर्तमान व्यवहार सही है, खासकर यदि आप मानते हैं कि शून्य को "अज्ञात मान" के रूप में व्याख्या किया गया है।

इस तरह से इसके बारे में सोचो: अगर किसी आप से पूछा कि क्या दो बक्से के अंदर सेब की संख्या है कि आप की सामग्री को नहीं पता था कि बराबर थे। जवाब हाँ या नहीं होगा, यह "मुझे नहीं पता" होगा।

+1

बिल्कुल, और जिस तरह से एसक्यूएल काम करता है, एनयूएलएल और झूठी –

3

मुझे लगता है कि आपको एसक्यूएल के बारे में आपके मूल तथ्यों को पूरी तरह से गलत मिला है।

NULL एक डेटा मूल्य है और UNKNOWN एक तार्किक मूल्य है।

NULL = NULLUNKNOWN है।

NULL = NULL निश्चित रूप से FALSE नहीं है!

Google "तीन मान तर्क" के लिए Google।

NULL मान अनुपलब्ध डेटा मान के लिए प्लेसहोल्डर है। आदर्श रूप से, NULL -able कॉलम का उपयोग केवल उन मानों के लिए किया जाना चाहिए जो केवल अस्थायी रूप से अनुपलब्ध हैं यानी एक उचित उम्मीद है कि एक गैर-NULL मान भविष्य में उपलब्ध होगा। DATETIME की एक जोड़ी में समाप्ति तिथि के लिए मूल्य का उपयोग करके अनंतता को इंगित करने के लिए अवधि का मॉडल करने के लिए उपयोग किया जाता है यानी यह अवधि चालू है (हालांकि एक भविष्य-भविष्य DATEITME मान अच्छी तरह से काम करता है)।

+0

के बीच सिर्फ एक निहित कास्ट है, मैं एक एसक्यूएल लड़का नहीं हूं, इसलिए यह पूरी तरह से संभव है। मैं ज्यादातर ऑरैकल के साथ काम करता हूं और ऑरैकल में + कुछ भी = नल और डुएल से चयन 1 जहां नल = नल 0 पंक्तियां देता है। मैंने पढ़ा है कि ऐसा इसलिए है क्योंकि "मुझे नहीं पता" शून्य की वैचारिक परिभाषा है। –

+0

आपकी रक्षा में, मुझे लगता है कि यह सच है कि ओरेकल सही ढंग से लागू नहीं करता है। आईआईआरसी, '' [खाली स्ट्रिंग] ओएसकल ओरेकल के लिए सही है, जबकि एसक्यूएल में यह गलत है। ध्यान दें कि एसक्यूएल डीडीएल के लिए एनयूएलएल का अलग-अलग व्यवहार किया जाता है उदा। एक पंक्ति-स्तर की जांच बाधा जो एनयूएलएल का मूल्यांकन करती है, अद्यतन को सफल होने की अनुमति देता है, एक प्रकार का 'संदेह का लाभ' प्रभाव। – onedaywhen

संबंधित मुद्दे