.NET में, एक मान प्रकार (C # struct
) का कोई पैरामीटर नहीं हो सकता है। इस पोस्ट के अनुसार यह सीएलआई विनिर्देश द्वारा अनिवार्य है। क्या होता है कि हर मूल्य-प्रकार के लिए एक डिफ़ॉल्ट कंस्ट्रक्टर (कंपाइलर द्वारा?) बनाया जाता है, जो सभी सदस्यों को शून्य (या null
) के लिए इनिशियलाइज़ करता है ।
ऐसे डिफ़ॉल्ट कंस्ट्रक्टर को परिभाषित करने के लिए इसे क्यों अस्वीकृत किया गया है?
एक तुच्छ उपयोग तर्कसंगत संख्याओं के लिए है:
public struct Rational {
private long numerator;
private long denominator;
public Rational(long num, long denom)
{ /* Todo: Find GCD etc. */ }
public Rational(long num)
{
numerator = num;
denominator = 1;
}
public Rational() // This is not allowed
{
numerator = 0;
denominator = 1;
}
}
C # के वर्तमान संस्करण का उपयोग करते हुए, एक डिफ़ॉल्ट तर्कसंगत 0/0
जो इतना अच्छा नहीं है।
पुनश्च : क्या डिफ़ॉल्ट पैरामीटर सी # 4.0 के लिए इसे हल करने में मदद करेगा या सीएलआर-परिभाषित डिफॉल्ट कंस्ट्रक्टर कहा जाएगा?
जॉन स्कीट ने उत्तर दिया:
अपने उदाहरण का उपयोग करने के लिए, जब कोई व्यक्ति क्या करना चाहेगा:
Rational[] fractions = new Rational[1000];
यह 1000 बार अपने निर्माता के माध्यम से चलना चाहिए?
निश्चित रूप से यह होना चाहिए, इसीलिए मैंने पहली बार में डिफॉल्ट कंस्ट्रक्टर लिखा। सीएलआर को डिफ़ॉल्ट शून्य निर्माणकर्ता का उपयोग करना चाहिए जब कोई स्पष्ट डिफ़ॉल्ट निर्माता परिभाषित नहीं होता है; इस तरह से आप केवल उसी चीज़ का भुगतान करते हैं जो आप उपयोग करते हैं। फिर अगर मुझे 1000 नॉन-डिफॉल्ट Rational
s का कंटेनर चाहिए (और 1000 कंस्ट्रक्शन को दूर करना है) तो मैं List<Rational>
एरे के बजाय इस्तेमाल करूंगा ।
यह कारण, मेरे दिमाग में, एक डिफ़ॉल्ट रचनाकार की परिभाषा को रोकने के लिए पर्याप्त मजबूत नहीं है।
Rational()
इसके बजाय पैरामीटर रहित ctor को आमंत्रित करता है Rational(long num=0, long denom=1)
।
new Rational()
अगर यह मौजूद है, तो निर्माता का आह्वान करेगा, हालांकि अगर यह मौजूद नहीं है, तो इसके new Rational()
बराबर होगा default(Rational)
। किसी भी स्थिति में आपको सिंटैक्स का उपयोग करने के लिए प्रोत्साहित किया जाता है default(Rational)
जब आप अपनी संरचना के "शून्य मान" (जो आपके प्रस्तावित डिजाइन के साथ एक "बुरा" संख्या चाहते हैं Rational
)। मान प्रकार के लिए डिफ़ॉल्ट मान T
हमेशा होता है default(T)
। तो new Rational[1000]
कभी भी संरचना निर्माताओं का आह्वान नहीं करेगा।
denominator - 1
संरचना के अंदर स्टोर कर सकते हैं , ताकि डिफ़ॉल्ट मान
Then if I want a container of 1000 non-default Rationals (and want to optimize away the 1000 constructions) I will use a List<Rational> rather than an array.
आप किसी सरणी को किसी संरचना के लिए किसी भिन्न निर्माता को सूची में लाने की अपेक्षा क्यों करेंगे?