2009-11-05 14 views
6

मुझे समझ में क्यों नेट पर नौ पूर्णांक प्रकार के होते हैं चाहते हैं: Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, और UInt64; प्लस अन्य संख्यात्मक प्रकार: Single, Double, Decimal; और इन सभी प्रकारों का कोई संबंध नहीं है।.NET primitives और टाइप पदानुक्रम, यह इस तरह क्यों डिजाइन किया गया था?

जब मैंने पहली बार सी # में कोडिंग शुरू की, तो मैंने सोचा "शांत, uint प्रकार है, मैं इसका उपयोग करने जा रहा हूं जब नकारात्मक मानों की अनुमति नहीं है"। तब मुझे एपीआई का कोई एपीआई uint लेकिन int का उपयोग नहीं हुआ, और uintint से नहीं लिया गया है, इसलिए एक रूपांतरण की आवश्यकता थी।

इन प्रकारों के वास्तविक विश्व अनुप्रयोग क्या हैं? क्यों नहीं, इसके बजाय, integer और positiveInteger क्यों नहीं है? ये वे प्रकार हैं जिन्हें मैं समझ सकता हूं। वर्षों में एक व्यक्ति की उम्र positiveInteger है, और positiveIntegerinteger का उप-समूह है, जब भी integer की अपेक्षा की जाती है तो रूपांतरण की आवश्यकता होती है।

निम्नलिखित XPath 2.0 और XQuery 1.0 में प्रकार पदानुक्रम का चित्र है। यदि आप xs:anyAtomicType के अंतर्गत देखते हैं तो आप संख्यात्मक पदानुक्रम decimal>integer>long>int>short>byte देख सकते हैं। .NET इस तरह डिज़ाइन क्यों नहीं किया गया था? क्या नया ढांचा "ओस्लो" अलग होगा?

alt text

+0

एपीआई में नहीं है, सीएलएस पर एक नज़र डालें। http://msdn.microsoft.com/en-us/library/12a7a7h3.aspx – Dykam

उत्तर

4

मेरा अनुमान होगा क्योंकि अंतर्निहित हार्डवेयर कि वर्ग पदानुक्रम टूट जाता है। वहाँ (शायद आश्चर्य की बात) कई बार कर रहे हैं जब आप परवाह है कि एक UInt32 एक 4 बाइट बड़ा और अहस्ताक्षरित है, तो एक UInt32Int32 का एक प्रकार नहीं है, और न ही एक Int32Int64 का एक प्रकार है।

और आप लगभग हमेशा int और float के बीच के अंतर के बारे में परवाह करते हैं।

मूल रूप से, विरासत & वर्ग पदानुक्रम गणितीय सेट समावेशन के समान नहीं हैं। तथ्य यह है कि UInt32 मान मान सकते हैं कि Int64 मानों का सख्त सबसेट हो सकता है इसका मतलब यह नहीं है कि UInt32Int64 का एक प्रकार है। कम स्पष्ट रूप से, Int32Int64 का एक प्रकार नहीं है - भले ही उनके बीच कोई वैचारिक अंतर न हो, उनके अंतर्निहित प्रतिनिधित्व अलग-अलग हैं (4 बाइट बनाम 8 बाइट्स)। Decimals और भी अलग हैं।

XPath अलग है: सभी संख्यात्मक प्रकारों के लिए प्रतिनिधित्व मौलिक रूप से समान हैं - ASCII अंकों की एक स्ट्रिंग। वहां, short और long के बीच का अंतर में से एक है प्रतिनिधित्व के बजाय रेंज - "123" दोनों short का वैध प्रतिनिधित्व है और एक ही मान के साथ long का वैध प्रतिनिधित्व है।

+0

क्या आप 'श्रेणीबद्ध पदानुक्रम' अंतर्निहित हार्डवेयर ब्रेक पर विस्तार कर सकते हैं ? –

+0

संकल्पनात्मक रूप से, आपके आरेख में पदानुक्रम सही है - एक बाइट छोटा का उप-समूह int का सबसेट है, आदि। यह XPath के लिए काम करता है, क्योंकि यह एक्सएमएल से निपट रहा है, जहां मूल्य 123 को बाइट "123" , छोटा "123", या लंबा "123" - प्रतिनिधित्व बिल्कुल वही हैं। यहां, प्रकार संभावित मानों पर एक बाधा है, लेकिन प्रतिनिधित्व को बदलता नहीं है। सी # के लिए, मूल्य 123 को बाइट, 0111 1011, लघु 0000 0000 0111 1011, int के रूप में स्मृति में दर्शाया जा सकता है ... ये प्रतिनिधित्व एक अलग आकार हैं, और हार्डवेयर को इसकी परवाह है। – RAOF

+0

मैं देखता हूं। फिर, हमें विभिन्न प्रतिनिधित्वों की आवश्यकता क्यों है? क्या कार्यक्रमों को और अधिक कुशल बनाना है? –

3

दशमलव गणना सटीक की जरूरत है कि (मूल रूप से, पैसा) के लिए है। यहां देखें: http://msdn.microsoft.com/en-us/library/364x0z75(VS.80).aspx

एकल/डबल्स decimals के लिए अलग हैं, क्योंकि वे एक अनुमान (मूल रूप से, वैज्ञानिक गणना के लिए) होने का इरादा रखते हैं।

यही कारण है कि वे संबंधित नहीं हैं।

बाइट्स और वर्ण का सवाल है, वे पूरी तरह से अलग कर रहे हैं: एक बाइट 0-255 है, जबकि एक चार एक चरित्र है, और इसलिए यूनिकोड वर्ण स्टोर कर सकते हैं (एक बहुत देखते हैं उनमें से 255 से अधिक!)

यूंट्स और इनट्स स्वचालित रूप से परिवर्तित नहीं होते हैं, क्योंकि वे प्रत्येक स्टोर के मूल्यों को स्टोर कर सकते हैं जो दूसरे के लिए असंभव हैं (यूंट्स में इन्ट्स की सकारात्मक सीमा दो बार होती है)।

एक बार जब आप इसे लटका लेंगे, तो यह वास्तव में बहुत समझ में आता है।

अपने उम्र बात का सवाल है, मैं बस एक पूर्णांक का उपयोग करें;)

+0

मैं समझता हूं कि इन संख्यात्मक प्रकारों से संबंधित क्यों नहीं हैं, मेरा सवाल यह है कि .NET इस तरह क्यों डिज़ाइन किया गया था? मुझे लगता है कि यह आरडीबीएमएस के साथ संगतता के लिए है। क्या आप अपने ऐप्स में यूंट का उपयोग करते हैं? –

+3

व्यक्तिगत रूप से यूंट का उपयोग करने की आवश्यकता कभी नहीं थी। और यदि आप कभी सोच रहे हैं 'इस तरह डिज़ाइन किया गया फीचर एक्स .net क्यों था?' सामान्य उत्तर 'क्योंकि जावा में इसकी तरह है';) – Chris

+1

एक कारण है कि int अक्सर उपयोग में उपयोग किया जाता है यह है कि यूंट सामान्य भाषा विशिष्टता के अनुरूप नहीं है। – porges