2010-02-21 9 views
20

इस कोड को ब्लॉक पर विचार करें:स्ट्रक्चर के अंदर गैर स्थैतिक फ़ील्ड क्यों शुरू नहीं किए जा सकते हैं?

struct Animal 
{ 
    public string name = ""; // Error 
    public static int weight = 20; // OK 

    // initialize the non-static field here 
    public void FuncToInitializeName() 
    { 
     name = ""; // Now correct 
    } 
} 
  • क्यों हम एक struct नहीं बल्कि एक non-static क्षेत्र के अंदर एक static क्षेत्र को प्रारंभ कर सकते हैं?
  • हमें विधियों के निकायों में non-static क्यों शुरू करना है?
+1

क्या पशु का हर उदाहरण भार 20 इकाइयों तक जा रहा है और इसका कोई नाम नहीं है? शायद आप एक निर्माता की तलाश में हैं। (अगर यह गलत है तो मेरी शब्दावली क्षमा करें।) – GManNickG

+2

यह सिर्फ नमूना कोड है। –

उत्तर

7
+2

हालांकि आईएल स्तर पर वे कर सकते हैं: http://msmvps.com/blogs/jon_skeet/archive/2008/12/10/value-types-and-parameterless-constructors.aspx –

+0

लिंक अब टूट गया है – Dominic

0

आप संरचना में एक कस्टम डिफ़ॉल्ट कन्स्ट्रक्टर नहीं लिख सकते हैं। उदाहरण फ़ील्ड प्रारंभकर्ताओं को आखिरकार उस कन्स्ट्रक्टर में स्थानांतरित करने की आवश्यकता होगी जिसे आप परिभाषित नहीं कर सकते हैं।

स्टेटिक फील्ड प्रारंभकर्ता स्थिर स्टैण्डक्टर में स्थानांतरित हो जाते हैं। आप एक संरचना में एक कस्टम स्थिर कन्स्ट्रक्टर लिख सकते हैं।

-1

पर एक नज़र आप कर सकते हैं है कि वास्तव में क्या आप की कोशिश कर रहे है। तुम सब भूल रहे हैं कि डिफ़ॉल्ट निर्माता कहता है एक कस्टम निर्माता है:

struct Animal 
{ 
    public string name = ""; 
    public static int weight = 20; 

    public Animal(bool someArg) : this() { } 
} 

निर्माता कम से कम एक पैरामीटर लेने के लिए है, और फिर इसे this() को अग्रेषित करने के लिए सदस्यों initialised प्राप्त करने के लिए है।

इस काम का कारण यह है कि संकलक अब name फ़ील्ड को शुरू करने के लिए कोड चलाने के समय को खोजने का एक तरीका है: जब भी आप new Animal(someBool) लिखते हैं।

किसी भी संरचना के साथ आप new Animal() कह सकते हैं, लेकिन सीएलआर के कामकाज में कई परिस्थितियों में "रिक्त" जानवरों को अंतर्निहित रूप से बनाया जा सकता है, और यह सुनिश्चित करने का कोई तरीका नहीं है कि हर बार कस्टम कोड चलाया जाए।

+0

यह संरचना जीती 'comp संकलित' में structs में उदाहरण फ़ील्ड प्रारंभकर्ता नहीं हो सकता है " –

1

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

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