C # में एक सामान्य प्रकार के रूप में 'शून्य' की अनुमति क्यों नहीं है


53

वे कौन से डिजाइन निर्णय थे जो voidरचनात्मक नहीं होने के बावजूद निर्माण योग्य नहीं होने के पक्ष में तर्क देते थे ? आखिरकार, यह सिर्फ एक विशेष खाली है structऔर अलग Funcऔर Actionप्रतिनिधि होने के कुल पीटीए से बचा होगा ।

(सी ++ स्पष्ट voidरिटर्न की अनुमति देता है और voidटेम्पलेट पैरामीटर के रूप में अनुमति देता है )


13
@Oded को देखते हुए कि एरिक लिपर्ट का एक खाता है और प्रोग्रामर्स में भाग लेता है , मुझे लगता है कि उन्होंने अभी किया।
थॉमस ओवेन्स

2
@BenVoigt जरूरी नहीं कि एक व्यक्ति के ज्ञान की आवश्यकता हो, हालाँकि यहाँ एक ही व्यक्ति है जो (आसानी से, मैं मान लेता हूँ) एकल सही उत्तर दे सकता है। विनिर्देश से परिचित कोई भी शायद सवाल का जवाब दे सकता है, खासकर अगर उन्हें प्रोग्रामिंग भाषा डिजाइन का ज्ञान है। यह एक दिलचस्प भाषा डिज़ाइन / भाषा कार्यान्वयन प्रश्न भी है, जो यहाँ विषय पर है।
थॉमस ओवेन्स

6
@BenVoigt: आप बिना किसी अच्छे कारण के, पूरी तरह से वैध और रोचक प्रश्न को बंद करने के लिए इतने उत्सुक क्यों हैं? मेरे पास एक खोज थी और इसका जवाब नहीं मिला; हो सकता है कि यहां किसी ने इसके बारे में एक ब्लॉग पोस्ट पढ़ी हो, हो सकता है कि निर्णय लेने वाले लोग इस सवाल का जवाब देना चाहते हों, हो सकता है कि किसी ने उन लोगों से बात की हो, जिन्होंने इस बारे में निर्णय लिया और खुद से सवाल पूछा और जवाब पर पास कर सकते हैं। मैंने इस साइट और SO पर पोस्ट करना बंद कर दिया है, क्योंकि लोगों को सवालों के जवाब देने की तुलना में प्रश्न को बंद करने में ज्यादा दिलचस्पी लगती है।

4
मैं यहाँ "बड़े बिंदु" के प्रश्नों और उत्तरों को इंगित कर सकता था और विशेष रूप से SO पर आमतौर पर "इस वाक्यविन्यास का क्या अर्थ है?" उन सवालों को शायद ही कभी बंद किया जा सकता है क्योंकि हर कोई कब्ज के संकेत के लिए परिभाषाओं को ढेर कर सकता है और हटा सकता है। अधिक दिलचस्प सवाल जो पीट ट्रैक से बाहर निकलते हैं, वे कुछ पांडित्यपूर्ण कारण के लिए साइट से बाहर निकलते हैं: गंभीरता से यह कहीं डेटा वेयरहाउस में केवल कुछ किलोबाइट है। क्या हम सभी बहुत कम उद्देश्य पूरा करने वाले नियमों की मनमानी व्याख्या करने के बजाय केवल आराम करने और सीखने को गले लगा सकते हैं?

2
@ThomasOwens: मैं एसओ की तुलना में इस साइट पर अधिक सक्रिय अर्थों में हूं। इस साइट पर मैं हर 300 में एक प्रश्न का उत्तर देता हूं। SO पर मैं हर 1500 में एक प्रश्न का उत्तर देता हूं। किन्नर-संख्या-उत्तर गतिविधि में अंतर बहुत अधिक अवसरों के लिए जिम्मेदार है SO पर C # प्रश्नों का उत्तर देना।
एरिक लिपर्ट

जवाबों:


69

"शून्य" के साथ मूलभूत समस्या यह है कि इसका मतलब किसी अन्य रिटर्न प्रकार के समान नहीं है। "शून्य" का अर्थ है "यदि यह विधि वापस आती है तो इसका कोई मूल्य नहीं है।" शून्य नहीं; नल एक मूल्य है। यह जो भी मूल्य देता है।

यह वास्तव में टाइप सिस्टम को गड़बड़ कर देता है। एक प्रकार की प्रणाली अनिवार्य रूप से विशेष मूल्यों पर मान्य संचालन के बारे में तार्किक कटौती करने के लिए एक प्रणाली है; एक शून्य वापसी विधि एक मान नहीं लौटाती है, इसलिए सवाल "इस चीज़ पर क्या कार्यवाही मान्य है?" बिल्कुल भी कोई मतलब नहीं है। वहाँ पर कोई "बात" नहीं है जिसके लिए एक ऑपरेशन वैध या अमान्य है।

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

इन सभी कारणों के लिए, "शून्य" एक प्रकार नहीं है जिसे तत्काल किया जा सकता है; इसका कोई मूल्य नहीं है , यह इसका पूरा बिंदु है। यह ऑब्जेक्ट के लिए परिवर्तनीय नहीं है, और एक शून्य रिटर्निंग विधि कभी भी गैर-शून्य-रिटर्निंग पद्धति के साथ बहुरूपिक रूप से इलाज नहीं किया जा सकता है क्योंकि ऐसा करने से स्टैक भ्रष्ट हो जाता है!

इस प्रकार, शून्य का उपयोग एक प्रकार के तर्क के रूप में नहीं किया जा सकता है, जो शर्म की बात है, जैसा कि आप ध्यान दें। यह बहुत सुविधाजनक होगा।

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

इस नस में कुछ और विचारों के लिए देखें:


C ++ एक जादुई सिंगलटन प्रकार का उपयोग किए बिना इसका समर्थन करता है। लेकिन मुझे लगता है कि सी ++ के साथ एक पूरी तरह से अलग "जेनरिक" शैली का उपयोग करना है फिर सी #।
विंस्टन एवर्ट

4
@WinstonEwert - मुझे पूरा यकीन है कि C ++ जेनरिक को बिल्कुल भी सपोर्ट नहीं करता है, बल्कि इसमें टेम्प्लेट हैं, जो मौलिक रूप से अलग हैं। जैसा कि मैंने इसे समझा, टेम्पलेट्स के साथ कंपाइलर एक वैश्विक खोज कर रहा है और आपके प्रकार के मापदंडों के साथ बदल रहा है, लेकिन जेनेरिक के साथ, टाइप सिस्टम एक उचित प्रकार का निर्माण कर रहा है। मैं यह भी सोचता हूं कि सी ++ टेम्प्लेट त्रुटियां इतनी अधिक क्यों थीं। मुझे यकीन है कि एरिक मुझे सही करेगा अगर मैंने कुछ भी सही नहीं कहा
एडम रैकिस

1
मुझे लगता है कि स्टैक पर उचित प्लेसमेंट प्राप्त करने के लिए और अन्य स्थानों पर जहां वे अंतर्निर्मित हैं, सभी संरचनाओं को संकलित समय पर संभाला जाता है। इस प्रकार Void0 स्टैक बाइट्स के अंदर तर्कों की अनंत राशि के रूप में पारित किया जाना ठीक होना चाहिए। जब किसी भी संरचना को objectविधि के लिए परिवर्तित करने या कॉल करने की आवश्यकता होती है (तो thisइसे प्राप्त करने के लिए बॉक्स Typeको स्मृति के क्षेत्र क्षेत्र (कई सीएलआर कार्यान्वयन के लिए) से पहले डाले गए संदर्भ के साथ रखा जाता है और इस तरह ठीक से संभाला जा सकता है। जैसा कि मेरे लिए टाइप केवल वस्तुओं का एक बड़ा सवाल है जिसे कुछ विशेषताओं (क्षेत्रों) द्वारा प्रतिष्ठित किया जा सकता है। Voidसिर्फ एक वस्तु है।
ony

1
@ ओलिवियरजैकॉट-डेसकॉम्ब: यदि voidकोई रिक्त मान प्रकार था, तो वह कथन मशीन कोड के शून्य निर्देशों में अनुवाद करेगा। हार्ड-कोडेड प्रकार के लिए बहुत उपयोगी नहीं है Void, लेकिन उन मामलों में उपयोगी है जहां एक प्रकार के कई सामान्य पैरामीटर हैं लेकिन कुछ मामलों में आवश्यक नहीं हैं।
सुपरकाट

2
@ EricLippert: मूल्य-प्रकार के रिटर्न मानों की उचित हैंडलिंग के लिए स्टैक से शब्दों की एक चर संख्या पॉप करने की क्षमता की आवश्यकता होगी। क्या शब्दों की संख्या शून्य होने देने के साथ कोई मौलिक कठिनाई होगी? यदि कॉल करने वाला स्थान को आवंटित करने और एक बफ़र को पारित करने के लिए ज़िम्मेदार है, तो टाइप सिस्टम को यह पहचानना होगा कि एक शून्य बफ़र का कोई अर्थ नहीं है, और शायद वह प्रयास के लायक नहीं माना गया था, लेकिन मुझे कोई "मौलिक" समस्या नहीं दिखती है ।
सुपरकाट

9

प्रेषक: http://connect.microsoft.com/VisualStudio/feedback/details/94226/allow-void-to-be-parameter-of-generic-class-if-not-in-c-then-just-in क्रम

यह वास्तव में डिजाइन द्वारा है - हम शून्य प्रकार के किसी भी उदाहरण (रनटाइम में कई अन्य प्रकारों के साथ) की अनुमति नहीं देते हैं। आप CreateInstance को एक शून्य या शून्य नहीं बना सकते हैं [] या तो। हमने सुरक्षा के लिए इन प्रकार के छेदों को प्लग किया।

मैं अपने जीवन के लिए यह नहीं देख सकता कि एक सुरक्षा छेद कितना शून्य है, लेकिन ... ऐसा कहते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.