2009-10-21 17 views
7

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

और एमएस से से: http://msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx - "structs बहुत वर्गों के लिए समान हैं" - "पर - " Int32 वर्ग int डेटा प्रकार लपेटता " दूसरी तरफ, सी # में सभी आदिम डेटा प्रकार सिस्टम नेमस्पेस में ऑब्जेक्ट्स हैं। प्रत्येक डेटा प्रकार के लिए, एक छोटा नाम, या उपनाम प्रदान किया जाता है। उदाहरण के लिए, int सिस्टम के लिए संक्षिप्त नाम है .Int32 "।

मेरा भ्रम मुख्य रूप से सी # के साथ है (मैंने कुछ समय के लिए जावा प्रोग्राम किया है)।

संपादित निम्नलिखित पैराग्राफ @Jon स्कीट

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

संपादित @Jon एक दिया है सी # पर बहुत स्पष्ट बयान इसलिए मैं अपनी सुझाई गई सच्चाइयों को हटा दूंगा और उसका जवाब देखूंगा।

आगे प्रश्न: क्या इन शर्तों का वास्तविक उपयोग क्या होना चाहिए इस पर सर्वसम्मति है? यदि सर्वसम्मति है तो मैं स्पष्ट रूप से वर्तनी के लिए बहुत आभारी हूं। अन्यथा मुझे लगता है कि शब्दावली उलझन में है और इसलिए सीमित उपयोग है।

सारांश बहुत स्पष्ट उत्तरों के लिए धन्यवाद। एक सहमति है (@ जोन से स्वीकार्य उत्तर देखें) जो वास्तव में इसे समझते हैं और एमएस दस्तावेज़ संगत होते हैं (हालांकि वे जावा में स्थानों को संदर्भित करते हैं और मैं इन्हें सी # के लिए गलत तरीके से पढ़ता हूं)

उत्तर

11

पहला बुलेट बिंदु सही है।

दूसरा नहीं है: the primitive types .NET में बूलियन, बाइट, एसबीटी, इंटेल 16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, और सिंगल हैं। एक संरचना आमतौर परnull पर सेट की जा सकती है, लेकिन वहां शून्य मूल्य प्रकार (Nullable<T>) भी हैं। ये अभी भी मूल्य प्रकार हैं, लेकिन सी # में सिंटैक्टिक चीनी है, "नल" को "प्रकार के लिए शून्य मान" के साथ समझाएं, जो एक शून्य मूल्य प्रकार के लिए एक उदाहरण है जहां HasValue झूठा रिटर्न देता है।

int और System.Int32 सी # में सटीक समानार्थी शब्द हैं। पूर्व के बाद के लिए सिर्फ एक उपनाम है। वे को उसी पर एक ही कोड संकलित करते हैं।

सी # में, कक्षाएं और इंटरफेस हमेशा संदर्भ प्रकार होते हैं। संरचनाएं और enums मूल्य प्रकार हैं - लेकिन प्रत्येक संरचना के एक बॉक्सिंग समतुल्य है (Nullable<T> के अलावा जो मुक्केबाजी के मामले में सीएलआर द्वारा अलग-अलग संभाला जाता है)। बॉक्स किए गए प्रकारों के अलग-अलग नाम नहीं होते हैं, और स्पष्ट रूप से सी # में संदर्भित नहीं किए जा सकते हैं (हालांकि वे सी ++/सीएलआई में हो सकते हैं)। .NET में java.lang.Integer जैसे अलग रैपर वर्ग समतुल्य java.lang.Integer जैसा नहीं है; ऐसे वर्गों को पेश करना समस्याग्रस्त होगा क्योंकि आप जावा में विपरीत, .NET में अपना खुद का मान प्रकार बना सकते हैं।

संदर्भ प्रकार और मूल्य प्रकारों के बारे में अधिक जानकारी के लिए, my article about it देखें।

+1

@ जोन ने प्रश्न संपादित किया और दूसरा बुलेट बिंदु हटा दिया, इसके बजाय आपके उत्तर की ओर इशारा किया। –

12

मैंने एमएस दस्तावेज़ नहीं देखा है इसके बारे में विरोधाभासी होने के लिए (एमएसडीएन कभी-कभी गलत होता है, लेकिन इस विशिष्ट मुद्दे पर, मैंने हमेशा इसे सही देखा है)। MSDN लिंक आप पोस्ट का कहना है:

प्रत्येक आदिम डेटा प्रकार के लिए जावा में, कोर वर्ग पुस्तकालय एक आवरण वर्ग है कि यह एक जावा वस्तु के रूप में प्रतिनिधित्व प्रदान करता है। उदाहरण के लिए, Int32 कक्षा int डेटा प्रकार को लपेटती है, और डबल क्लास डबल डेटा प्रकार को लपेटती है। सी # में

दूसरी ओर पर, सभी आदिम डेटा प्रकार सिस्टम नाम स्थान में वस्तुओं रहे हैं। प्रत्येक डेटा प्रकार के लिए, एक छोटा नाम, या उपनाम प्रदान किया जाता है। उदाहरण के लिए, int सिस्टम का छोटा नाम है। INT32 और डबल सिस्टम का रूप है। डबल।

असल में, यह सही बात कह रहा है। जावा में, Integer कक्षा int आदिम प्रकार के लिए एक रैपर है। सी #, int में System.Int32 संरचना के लिए उपनाम है। पहला पैराग्राफ जावा और के बारे में है सी # पर लागू नहीं होता है।


नेट में, शब्दावली इस प्रकार है:

एक आदिम प्रकार एक प्रकार सत्य पर IsPrimitive property सेट किया है। आदिम प्रकार हैं:

आदिम प्रकार बूलियन हैं, बाइट, SByte, int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, चार, डबल, और एकल।

सभी आदिम प्रकार मूल्य प्रकार हैं लेकिन इसके विपरीत नहीं हैं।

मूल्य प्रकारtype that has value semantics, as opposed to reference semantics है। मान द्वारा पारित होने पर पूरा मूल्य कॉपी किया जाता है (इसका संदर्भ नहीं)। मूल्य प्रकार के स्थानीय चर ढेर पर संग्रहीत हैं। struct एस और enum एस मूल्य प्रकार हैं।

जैसा ऊपर बताया गया है, सभी आदिम प्रकार मूल्य प्रकार हैं। वे System नामस्थान में struct एस हैं। सी #, int, double, आदि में, कीवर्ड मूल रूप से उन struct एस के लिए उपनाम हैं।