2009-02-26 16 views
8

मैंने इसे विरासत कोड में और कुछ .NET ओपन सोर्स प्रोजेक्ट में देखा है। मैं ऐसा करने का कोई कारण नहीं सोच सकता। बस "शून्य" का उपयोग करना मेरे लिए इतना आसान लगता है।लोग अपने कोड में शून्य के बजाय जादू मूल्यों का उपयोग क्यों कर रहे हैं?

उदाहरण:

public class Category 
{ 
    int parentID; 

    bool HasParent 
    { 
     get 
     { 
      return parentID != -1; 
     } 
    } 
} 

बनाम

public class Category 
{ 
    int parentID; 

    bool HasParent 
    { 
     get 
     { 
      return parentID != null; 
     } 
    } 
} 
+0

यदि आप कम से कम एक उदाहरण दिखाते हैं तो आप बेहतर प्रदर्शन करेंगे। – GEOCHET

+0

-1: कोई कोड नहीं। -1: कोई समस्या नहीं है। समस्या क्या है? क्या काम नहीं करता है? –

+0

आपने चेक को उलट दिया है (parentid! = Null होना चाहिए), लेकिन मुझे लगता है कि सवाल मान्य है। +1 – erikkallen

उत्तर

0

तुम सच में देखने के लिए आवेदन में देखा है? जब तक जादू वर्ण एक वर्णनात्मक नाम के साथ एक ही स्थान पर आयोजित किया जाता है, यह काफी उपयोगी हो सकता है।

+0

हां, वे एक ही स्थान पर एक वर्णनात्मक मान के साथ आयोजित किए जाते हैं, जैसे नल नलइंटर और नल नलडेट, लेकिन मैं यह समझने में सक्षम नहीं था कि यह उपयोगी क्यों है – Paco

+0

फिर यह "जादू मूल्य" बिल्कुल नहीं है - जादू मूल्य स्रोत कोड में अक्षर हैं जिनके पास कोई संदर्भ नहीं है और इसलिए संदिग्ध अर्थ है। –

+0

मैं इसे एक जादू मान मानता हूं क्योंकि आपको यह जानना है कि यह केवल एक पूर्णांक या तारीख नहीं है, लेकिन आपको इसका अर्थ यह जानने के लिए Null.NullObject से इसकी तुलना करनी चाहिए। आप यह नहीं जान सकते कि मूल्य का उपयोग करने से पहले आपको इसे nullobject से तुलना करना है। – Paco

3

एक शून्य वस्तु होने से अपवादों को फेंक दिया जा सकता है, जबकि त्रुटि कोड (जैसे "-1" विफलता केस) अपवाद नहीं फेंक देगा।

यह उन भाषाओं या अनुप्रयोगों में महत्वपूर्ण हो सकता है जो अपवादों को अच्छी तरह से संभाल नहीं पाते हैं।

2

बड़े डेटावायरहाउस पर काम करना, मैं कभी-कभी 0 घन का उपयोग करता हूं, अगर शून्य, मेरे घन में एक गैर शून्य मूल्य डालने के लिए। मेरे पास हमेशा सभी आयामों में 'अज्ञात' मान से संबंधित 0 आईडी है, इसलिए मेरे पास कोई शून्य नहीं है जिसमें कोई शून्य मान नहीं है।

उस में मुख्य ब्याज सरल और अधिक कुशल प्रश्न हैं करने के लिए है

4

ये अक्सर जब सी में प्रोग्रामिंग कई एक सी प्रोग्रामर नल ints की बर्बादी, पर horified किया जाएगा विकसित की आदतों कर रहे हैं जो बहुत ही कम से कम एक पूरी अतिरिक्त बिट, और संभवतः एक सूचक भी की आवश्यकता है। यह विशेष रूप से खराब होता है जब आप जानते हैं कि मूल्य सकारात्मक होने जा रहा है और आपके पास झंडे के लिए उपयोग करने के लिए नकारात्मक मानों की पूरी जगह है। -1 का मतलब निर्धारित नहीं हो सकता है, -2 का मतलब यह हो सकता है कि माता-पिता इस नोड के संदर्भ में भी समझ में नहीं आता है, -3 का मतलब यह हो सकता है कि नोड में एक माता-पिता था जो काम को संभाल नहीं सकता था और पीने के बिंग पर छोड़ दिया था और कभी नहीं देखा गया था, आदि ...

सी # दुनिया में 2 जीबी + रैम वाले कंप्यूटरों के साथ नलनीय इन्ट्स (और आरडीएमएस के साथ उनके आसान एकीकरण) की सफाई का मतलब है कि पुरानी सी आदतें धीरे-धीरे मर रही हैं, लेकिन पुरानी आदतें मुश्किल से मरना।

1

प्रत्येक भाषा/पर्यावरण में शून्य मूल्य प्रकार उपलब्ध नहीं हैं; उन्हें .NET 2.0 में जोड़ा गया था। यदि आपका विरासत कोड .NET आधारित है और 1.1 फ्रेमवर्क का उपयोग करके शुरू किया गया था, तो आपका जवाब यह है कि उस समय शून्य एक विकल्प नहीं था।

11

क्योंकि "शून्य" मान होने के कारण, प्रकार शून्य हो जाना चाहिए। इस संदर्भ प्रकार (किसी भी वर्ग आप को परिभाषित करने और मानक पुस्तकालय) के लिए ठीक काम करता है, और यदि आप देखो तो आप देखेंगे कि लोग उपयोग अशक्त कर जब भी वे कोई मूल्य नहीं

Employee employee = Employees.Find("John Smith"); 
if(employee == null) throw new Exception("Employee not found"); 

मुद्दे के साथ एक संदर्भ वस्तु है आता है जब आप मान प्रकार int, char या float जैसे प्रकार का उपयोग करते हैं। संदर्भ प्रकारों के विपरीत, जो स्मृति में कहीं और डेटा के ब्लॉक को इंगित करता है, इन मानों को इनलाइन और इनलाइन में घुमाया जाता है (कोई पॉइंटर/संदर्भ नहीं होता है)।

इस वजह से, डिफ़ॉल्ट रूप से, मान प्रकार में शून्य मान नहीं है। आपके द्वारा प्रदान किए गए कोड में, माता-पिता के लिए असंभव है (मुझे वास्तव में आश्चर्य है कि यह आपके कंपाइलर द्वारा भी प्राप्त हुआ है - विजुअल स्टूडियो 2008 और शायद 2005 एक हरे रंग की रेखा रेखा खींचेंगे और आपको बताएंगे कि कथन हमेशा गलत है) ।

एक शून्य मान के लिए एक पूर्णांक के लिए आदेश में, आप के रूप में यह घोषणा करने के लिए की जरूरत है नल

int? parentID; 

अब parentID, एक शून्य मान शामिल कर सकते हैं, क्योंकि यह अब एक सूचक (अच्छी तरह से है " संदर्भ ") 32 बिट पूर्णांक के बजाय, 32 बिट पूर्णांक के लिए।

तो उम्मीद है कि आप समझते हैं कि क्यों "जादू मूल्य" अक्सर मूल प्रकारों (मूल्य प्रकार) के साथ शून्य का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं। यह केवल बहुत बड़ी परेशानी है, और अक्सर एक बड़े प्रदर्शन हिट (लुकअप क्या बॉक्सिंग/अनबॉक्सिंग है), इन मान प्रकारों को मूल्य के संदर्भ के रूप में स्टोर करने के लिए उन्हें शून्य होने की अनुमति देने के लिए।

संपादित करें:

मुक्केबाजी और बॉक्स से निकालना (सी # प्रोग्रामिंग गाइड)

: के बारे में मुक्केबाजी/unboxing आगे के संदर्भ (क्या आप एक पूर्णांक == बातिल की आवश्यकता है) के लिए, MSDN पर आलेख देखें

प्रदर्शन

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

+0

मैं ऐसे मामले की कल्पना नहीं कर सकता जहां यह बहुत छोटा प्रदर्शन लाभ महत्वपूर्ण है। – Paco

+2

ओवरहेड * छोटा नहीं है * - आप * मौलिक * डेटा प्रकारों और संचालन में मुक्केबाजी/अनबॉक्सिंग संचालन जोड़ने के बारे में बात कर रहे हैं। मुक्केबाजी ओवरहेड की वजह से मान कमजोर होने पर एक सशर्त पूर्णांक अतिरिक्त ऑपरेशन कर रहे बेंचमार्क 9 गुना धीमा हो जाता है। अपने लिए कोशिश करो। – David

+0

मुझे पता है कि यह कितना समय लगता है, लेकिन मुझे ओ (एन) एल्गोरिदम अनुकूलित करने में विश्वास नहीं है। – Paco

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

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