2012-02-07 9 views
8

क्यों अगर मैं का उपयोग करें:Struct - Layout.Explicit - निर्माता - पूरी तरह से असाइन क्षेत्रों

struct MyStruct 
{ 
     [FieldOffset (0)] public uint Data; 
     [FieldOffset (0)] public byte Something; 
} 

public MyStruct (uint pData) 
{ 
    Data = pData; // setting Data field also sets Something field 
} 

सी # का कहना है मैं आवंटित करने के लिए 'कुछ' क्षेत्र की जरूरत है:/मैं जानता हूँ कि मैं एक "निर्माता कर सकते हैं: इस() " लेकिन कंपाइलर को पता होना चाहिए कि 'डेटा' फ़ील्ड में 'कुछ' फ़ील्ड है।

तो, मुझे पहले पैरामीटर रहित कन्स्ट्रक्टर को कॉल करना चाहिए, क्या यह एकमात्र तरीका है?

उत्तर

-2

यदि आप कस्टम कन्स्ट्रक्टर को परिभाषित करते हैं तो आपको संरचना के सभी फ़ील्ड को प्रारंभ करने की आवश्यकता है। अधिक जानकारी के लिए this एमएसडीएन ट्यूटोरियल देखें - खासकर कन्स्ट्रक्टर्स और विरासत शीर्षक के तहत।

Structs कंस्ट्रक्टर्स घोषणा कर सकते हैं, लेकिन वे पैरामीटर नहीं होना चाहिए:

यहाँ एक पैराग्राफ संबंध उस लिंक से यह करने के लिए निकाला जाता है। एक संरचना के लिए एक डिफ़ॉल्ट (पैरामीटर रहित) कन्स्ट्रक्टर घोषित करने में त्रुटि है। संरचना सदस्यों के पास प्रारंभकर्ता नहीं हो सकते हैं। संरचना सदस्यों को उनके डिफ़ॉल्ट मानों को प्रारंभ करने के लिए हमेशा एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान किया जाता है।

+0

मैं कुछ और के बारे में बात कर रहा हूं। – zgnilec

+0

@zgnilec उस मामले में मैं आपके प्रश्न की समीक्षा करने का सुझाव दूंगा क्योंकि यह बहुत समझ में नहीं आता है। –

+0

ठीक है, शायद कोई और मुझे समझ जाएगा। – zgnilec

5

हां, आपको डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करने की आवश्यकता होगी।

public MyStruct (uint pData) : this() 
{ 
    //... 
} 

संकलक फिर अपने निर्माता की शुरुआत में निम्नलिखित आईएल निर्देश उत्पन्न करेगा:

ldarg.0   // Push address of struct onto stack 
initobj MyStruct // Pop address of struct and initialize it with "all zeros" 
+0

यह बहुत उपयोगी है। यह एक या अधिक नैनोसेकंड द्वारा कोड को गति देता है (इस पर निर्भर करता है कि कितने फ़ील्ड हैं)। – Forestrf

0

लगता है जैसे कि यह संभव नहीं है, और इसके बारे में चर्चा को बंद कर दिया गया है:

यहां इस मुद्दे के बारे में चर्चा का एक लिंक दिया गया है:

https://github.com/dotnet/roslyn/issues/7323

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