सी # में, एक निर्माता अनुक्रम चलाता है:
Chain to base class constructor
Perform all field initializers
Execute user-supplied code for constructor
कोई फ्रेमवर्क-बेस नहीं है एड कारण क्यों सी # चीजों को क्रम में करता है, जैसा कि यह करता है कि vb.net उन्हें एक अलग अनुक्रम में कर सकता है और करता है। सी # दृष्टिकोण के लिए डिज़ाइन औचित्य यह है कि सभी फ़ील्ड प्रारंभकर्ताओं (व्युत्पन्न- साथ ही बेस-क्लास फ़ील्ड्स के लिए) चलाने से पहले बाहरी दुनिया में किसी वस्तु को उजागर करने की कोई संभावना नहीं होनी चाहिए; चूंकि बेस-क्लास कन्स्ट्रक्टर किसी ऑब्जेक्ट को बाहरी दुनिया में उजागर कर सकता है, इसलिए उस आवश्यकता को लागू करने का मतलब है कि फ़ील्ड प्रारंभकर्ता को बेस-क्लास कन्स्ट्रक्टर से पहले चलाना चाहिए।
व्यक्तिगत रूप से, मुझे यह औचित्य विशेष रूप से विश्वास नहीं मिलता है। ऐसे कई परिदृश्य हैं जिनमें फ़ील्ड को उपयोगी मूल्यों पर सेट करना संभव नहीं होगा, जो जानकारी के बिना आधार कन्स्ट्रक्टर चलाने से पहले उपलब्ध नहीं होंगे। कोई भी कोड जिसका बेस कन्स्ट्रक्टर आंशिक रूप से निर्मित उदाहरणों का पर्दाफाश कर सकता है, उस संभावना के लिए तैयार होना आवश्यक है। हालांकि कई बार यह निर्दिष्ट करना उपयोगी होगा कि एक फील्ड प्रारंभकर्ता को "प्रारंभिक" चलाना चाहिए, मुझे लगता है कि ऐसी कई स्थितियां हैं जहां उनके लिए अजीब वस्तु तक पहुंचने में सक्षम होना उपयोगी है (कुछ मायनों में क्योंकि मुझे विश्वास है कि क्लास फ़ील्ड्स जिनके मूल्यों को क्लास इंस्टेंस के जीवनकाल के दौरान इनवेरिएंट के रूप में माना जाना चाहिए, जब व्यावहारिक रूप से रचनाकार के भीतर प्रारंभिक रूप से प्रारंभिक रूप से सेट किया जाना चाहिए)।
संयोग से, एक विशेषता जिसे मैं दोनों vb.net और सी # में देखना चाहता हूं, पैरामीटर-प्रारंभिक फ़ील्ड और छद्म-फ़ील्ड घोषित करने का माध्यम होगा। यदि किसी वर्ग में एक निश्चित नाम और प्रकार का पैरामीटर-प्रारंभिक फ़ील्ड होता है, तो उस वर्ग के प्रत्येक कन्स्ट्रक्टर जो एक ही कक्षा के किसी अन्य श्रृंखला में नहीं है, उचित नामों और प्रकारों के साथ पैरामीटर होना चाहिए। उन क्षेत्रों के मूल्यों को कन्स्ट्रक्टर में सेट किया जाएगा इससे पहले कि कुछ और किया जाता है, और अन्य फील्ड प्रारंभकर्ताओं के लिए सुलभ होगा। छद्म-क्षेत्र क्षेत्रीय रूप से क्षेत्रों की तरह व्यवहार करेंगे, सिवाय इसके कि वे केवल फ़ील्ड प्रारंभकर्ताओं के भीतर प्रयोग योग्य होंगे, और इसे कन्स्ट्रक्टर के भीतर स्थानीय चर के रूप में लागू किया जाएगा। ऐसी सुविधा कई प्रकार की संरचनाओं को अधिक सुविधाजनक बनाती है। उदाहरण के लिए, अपने जीवन भर एक विशेष सरणी उदाहरण धारण करने के लिए करता है, तो एक प्रकार माना जाता है, कहने के लिए सक्षम किया जा रहा:
readonly param int Length;
readonly ThingType[] myArray = new ThingType[Length];
या तो वर्ग निर्माता में सरणी के निर्माण के लिए की तुलना में अच्छे प्रतीत होता है (जो ऐसा नहीं कर सकता बेस कन्स्ट्रक्टर के चलने के बाद तक) (या vb.net के लिए) को बेस-क्लास कन्स्ट्रक्टर तक लम्बाई पास करनी होती है जो तब इसे एक फ़ील्ड सेट करने के लिए उपयोग कर सकती है (जो क्लास में स्पेस पर कब्जा कर लेती है, भले ही उसका मूल्य - Length
ऊपर की तरह - अनावश्यक हो सकता है)।
नहीं, इसका कारण यह संकलित नहीं करता है कि आधार वर्ग में 'पहचान' है, यह केवल इसलिए है क्योंकि यह एक उदाहरण सदस्य है। तो, शीर्षक में प्रश्न जो आप करने की कोशिश कर रहे हैं उससे प्रासंगिक नहीं है ... – Guffa