2010-08-05 13 views
8

मैंने हाल ही में पढ़ा है कि सी # और सीएलआई मानक मूल्य प्रकारों और रचनाकारों को संभालने के विभिन्न तरीकों को परिभाषित करते हैं।सी # और सीएलआई के बीच अंतर क्या है जब यह मूल्य प्रकारों और रचनाकारों के साथ आता है?

सीएलआई विनिर्देश मान प्रकारों के अनुसार पैरामीटर रहित कन्स्ट्रक्टर नहीं हो सकते हैं, जबकि सी # विनिर्देश मान प्रकारों में एक डिफ़ॉल्ट पैरामीटर रहित कन्स्ट्रक्टर होता है। यदि, सीएलआई विनिर्देश के अनुसार, आपको किसी भी पैरामीटर को निर्दिष्ट किए बिना एक मूल्य बनाने की आवश्यकता है, तो इसके साथ ऐसा करने के लिए एक विशेष निर्देश है।

तो मेरे सवालों का

  • क्यों सी # डिजाइनरों जानबूझकर CLI मानक से विचलित हैं कर रहे हैं - क्या लाभ यह करने के लिए नहीं था, और क्यों CLI इस कार्यक्षमता की अनुमति नहीं है?
  • मेरे सीमित अनुभव में, जब भी मैं अपने आप को 'विशेष निर्देश' का उपयोग करके खुद को कार्यक्षमता की अनुमति देने के लिए ढूंढता हूं जो प्रारंभ में नहीं था, यह आमतौर पर एक हैक का थोड़ा सा होता है। यह अलग कैसे है?
+0

क्या आपने अभी तक परावर्तक का उपयोग कर कोड देखा है? –

+0

नहीं, मेरे पास इस तरह के देखने के लिए कोई विशिष्ट कोड नहीं है, मैं उस संदेश पर आधारित हूं जिसे मैंने – DaveDev

+0

पढ़ा है, ब्याज से, आपने इसे कहां पढ़ा? मुझे पता है कि मैंने कुछ ऐसा बताया है, लेकिन मैंने कई अन्य लोगों को इसका उल्लेख नहीं किया है। –

उत्तर

7

विभिन्न स्थानों पर, यह पैरामीटर रहित कन्स्ट्रक्टर के रूप में मूल्य प्रकारों के बारे में सोचने के लिए स्थिरता बिंदु से समझ में आता है। आप हमेशा कोई तर्क प्रदान किए बिना एक मूल्य बना सकते हैं, और यह सीएलआई और सी # दोनों में सच है।

int x = new int(); 

बल्कि इसके लिए एक वाक्य रचना और एक 'असली' निर्माता लागू के लिए एक अलग वाक्य रचना होने से: सी # में, आप बस मानक निर्माता सिंटैक्स का उपयोग कर सकते हैं।

नोट सी # 2 के रूप में, वहाँ डिफ़ॉल्ट मान ऑपरेटर जो मैं बजाय प्रयोग किया जा सकता था लगता है कि:

int x = default(int); 

कि आईएल के करीब महसूस करता है उत्पन्न, वास्तव में। मुझे लगता है कि यह संभव है कि अगर हम इसे शुरू करना चाहते हैं, तो सी # ने "नाटक" नहीं किया होगा कि सभी मूल्य प्रकारों में पैरामीटर रहित कन्स्ट्रक्टर हैं।

public void Foo<T>() where T : new() 
{ 
    T t = new T(); 
} 

कि मूल्य प्रकार के लिए अनुमति दी जानी चाहिए:

दूसरी ओर, जेनरिक पर विचार? यह है - लेकिन अगर सी # new int() की अनुमति नहीं दी तो यह एक सामान्य रूप में अनुमति देने के लिए ज्यादा मतलब नहीं होगा ...

एक दिलचस्प बात आप और अधिक गहराई में को देखने के लिए चाहते हो सकता है - हालांकि सी # आपको कस्टम मान प्रकार पैरामीटर रहित कन्स्ट्रक्टर को परिभाषित नहीं करने देगा, आप आईएल में ऐसा कर सकते हैं, और सी # कभी-कभी संदर्भ के आधार पर (और कभी-कभी नहीं) इसका उपयोग कर सकते हैं। my blog entry for more details देखें।

0

सी # विनिर्देश मूल्य प्रकार में जबकि एक डिफ़ॉल्ट parameterless निर्माता

आप बदल नहीं सकते कि है। तो प्रभाव एक जैसा है, बस अलग परिभाषित किया गया है।

0

मूल्य प्रकारों और वर्ग प्रकारों के बीच एक महत्वपूर्ण अंतर यह है कि क्लास-प्रकार के उदाहरण, मूल्य-प्रकार के उदाहरणों के विपरीत, केवल एक निर्माता को कॉल करके अस्तित्व में लाया जा सकता है, और जब तक कि कन्स्ट्रक्टर तक बाहरी दुनिया में नहीं आ जाता निर्माण के तहत वस्तु को पूरा या स्पष्ट रूप से उजागर करता है। इसके विपरीत, मूल्य-प्रकार के उदाहरणों को एक संलग्न संरचना या कक्षा-प्रकार के उदाहरण के साथ मूल्य-प्रकार फ़ील्ड के साथ, या मूल्य-प्रकार तत्वों की सरणी के निर्माण द्वारा अस्तित्व में लाया जाएगा। हालांकि कोई तकनीकी कारण नहीं होगा कि क्यों माइक्रोसॉफ्ट ने स्पष्ट पैरामीटर रहित रचनाकारों को structs के लिए परिभाषित करने की अनुमति नहीं दी थी, यह सुनिश्चित करना मुश्किल होगा कि प्रत्येक संरचना के पास बाहरी दुनिया के संपर्क में आने से पहले इसका पैरामीटर रहित कन्स्ट्रक्टर चलाएगा, और यह कुछ परिस्थितियों में ऐसे कन्स्ट्रक्टर चलाने के लिए भ्रमित हो रहा था लेकिन दूसरों को नहीं।

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