दोनों सी # और जावा आदिम या) है। "
जावा में के सभी प्रकार के प्राचीन प्रकार (जो जावा में एक छोटा परिमित सेट है) के लिए रैपर क्लास प्रकार हैं जो उन्हें ऑब्जेक्ट के रूप में माना जा सकता है। double/Double
, int/Integer
, bool/Boolean
, आदि। ये रैपर प्रकार संदर्भ-प्रकार हैं (पढ़ें: कक्षाएं) और, जैसे null
ऐसे टाइप किए गए अभिव्यक्तियों/चरों को असाइन करने के लिए एक वैध मान है। जावा के हाल के संस्करण (1.5/5 +) प्राइमेटिव्स से उनके संबंधित रैपर तक अंतर्निहित दबाव में जोड़ें। ;, भाग में सी # के माध्यम सेstructures मूल्य प्रकार के एक अनंत सेट का समर्थन करता है, क्योंकि -
// Java
Boolean b = true; // implicit conversion boolean -> Boolean (Java 5+)
Boolean b = null; // okay, can assign null to a reference type
boolean n = null; // WRONG - null is not a boolean!
सी # एक इस तरह के एक प्रत्यक्ष रैपिंग प्रदान नहीं करता है बल्कि, 0 #रैपर प्रकार की शुरूआत से सी # हैंडल "शून्य मूल्य प्रकार" हैंडल करता है। इसके अलावा जावा की तरह सी #, मूल्य प्रकार T
से Nullable<T>
से अंतर्निहित रूपांतरण है, इस प्रतिबंध के साथ कि टी "नामुमकिन प्रकार" नहीं है।
// C#
Nullable<bool> b = true; // implicit conversion bool -> bool?
bool? b = true; // short type syntax, implicit conversion
bool? b = null; // okay, can assign null as a Nullable-type
bool b = null; // WRONG - null is not a bool
ध्यान दें कि Nullable<T>
भी एक मान प्रकार है और इस तरह जब/अगर एक मूल्य के "ढेर पर" है या नहीं करने के लिए मानक संरचना नियमों का पालन करती।
टिप्पणी के जवाब में:
बिल्कुल सही, Nullable एक मूल्य की तरह किया जा रहा है कुछ मामलों में एक अधिक कॉम्पैक्ट स्मृति पदचिह्न के लिए के रूप में यह एक संदर्भ की स्मृति भूमि के ऊपर से बच सकते हैं समर्थ बनाता है, टाइप करें: What is the memory footprint of a Nullable<T>। हालांकि इसे अभी भी गैर-शून्य प्रकार की तुलना में अधिक मेमोरी की आवश्यकता है क्योंकि यह याद रखना है कि मान क्या है, ठीक है, शून्य है या नहीं। संरेखण के मुद्दों और वीएम कार्यान्वयन के आधार पर, यह "पूर्ण" ऑब्जेक्ट से काफी कम हो सकता है या नहीं। इसके अतिरिक्त, क्योंकि सी #/CLR में मानों reified कर रहे हैं, किसी भी उठाने आपरेशन कि किया जाना चाहिए पर विचार करें:
// C#
object x = null;
x = (bool?)true;
(x as bool?).Value // true
लेख संदर्भ प्रकार स्मृति की खपत के बारे में बात करती है Java Tip 130: Do you know your data size? (जावा में)। ध्यान देने योग्य बात यह है कि JVM में आंतरिक रूप से Arrays के विशेष संस्करण हैं, प्रत्येक आदिम प्रकार और ऑब्जेक्ट्स के लिए एक (हालांकि, कृपया ध्यान दें कि इस आलेख में भ्रामक बयान) शामिल हैं। ध्यान दें कि ऑब्जेक्ट्स (बनाम प्राइमेटिव्स) में अतिरिक्त मेमोरी ओवरहेड और बाइट संरेखण के मुद्दे कैसे होते हैं। सी # हालांकि, Nullable<T>
प्रकार बनाम अनुकूलित विशेष-मामलों के लिए अनुकूलित किए गए सरणी मामले को बढ़ा सकता है क्योंकि Nullable<T>
स्वयं ही एक संरचना प्रकार (या "आदिम") है।
हालांकि, एक ऑब्जेक्ट, केवल एक परिवर्तनीय स्लॉट में "संदर्भ" बनाए रखने के लिए एक छोटे से निश्चित आकार की आवश्यकता होती है। दूसरी ओर Nullable<LargeStruct>
प्रकार का एक वैरिएबल स्लॉट, LargeStruct+Nullable
के लिए स्थान होना चाहिए (स्लॉट स्वयं ढेर पर हो सकता है)। C# Concepts: Value vs Reference Types देखें। ध्यान दें कि चर के ऊपर "उठाने" उदाहरण में object
: object
सी # (संदर्भ प्रकार और मूल्य प्रकार दोनों के माता-पिता) में "मूल प्रकार" है और एक विशिष्ट मान प्रकार नहीं है।
सी # भाषा उपनाम आदिम/आम प्रकार है कि 'दोस्ताना लोअरकेस "प्रकार के नाम करने के लिए उपयोग की अनुमति के लिए की एक निश्चित सेट का समर्थन करता है।उदाहरण के लिए, double
System.Double
और int
के लिए उपनाम System.Int32
के लिए उपनाम है। जब तक कोई अलग Double
प्रकार दायरे में आयात नहीं किया जाता है, double
और Double
उसी प्रकार का संदर्भ C# में संदर्भित करेगा। मैं उपनामों का उपयोग करने की सलाह देता हूं जब तक कि अन्यथा करने का कोई कारण न हो।
मैं तर्क दूंगा कि यह एक "अलग" से अधिक है, क्योंकि इसका मुकाबला मुक्केबाजी नहीं है - यानी 'शून्य' एक शून्य, ** गैर-बॉक्स वाला **, 32-बिट हस्ताक्षरित पूर्णांक है। –
आप कहते हैं "जावा के हाल के संस्करण (1.5) स्पष्ट दबाव में जोड़ते हैं" - मुझे लगता है कि आपके पीछे यह है। जावा में हमेशा आदिम प्रकारों और उनके ऑब्जेक्ट समकक्षों के बीच ** स्पष्ट ** रूपांतरण होते हैं, लेकिन जावा 1.5 में भाषा को ** अंतर्निहित ** रूपांतरण ऑटोबॉक्सिंग/अनबॉक्सिंग के रूप में प्राप्त होता है। –
@ डैनियल आप सही हैं। –