फील्डफिनिट झंडा पहले क्या करता है? जब मैं अपनी कक्षा के आईएल में देखता हूं तो मुझे यह ध्वज दिखाई देता है लेकिन मुझे नहीं पता कि यह ध्वज वास्तव में क्या कर रहा है?
फील्डफिनिट झंडा पहले क्या करता है? जब मैं अपनी कक्षा के आईएल में देखता हूं तो मुझे यह ध्वज दिखाई देता है लेकिन मुझे नहीं पता कि यह ध्वज वास्तव में क्या कर रहा है?
जवाबों:
मेरा लेख देखेंइस मुद्दे पर ।
मूल रूप से, beforefieldinit
इसका अर्थ है "किसी भी स्थिर फ़ील्ड को संदर्भित करने से पहले किसी भी बिंदु पर प्रकार को आरंभ किया जा सकता है।" सिद्धांत रूप में इसका मतलब है कि यह बहुत आलस्यपूर्ण हो सकता है - यदि आप एक स्थैतिक विधि को कहते हैं जो किसी भी क्षेत्र को नहीं छूती है, तो JIT को इस प्रकार को प्रारंभ करने की आवश्यकता नहीं है।
व्यवहार में इसका मतलब यह है कि वर्ग को पहले की तुलना में प्रारंभिक किया गया है अन्यथा यह होगा - यह ठीक है कि इसे पहली विधि के प्रारंभ में आरंभ किया जाए जो इसका उपयोग कर सकती है। इसकी तुलना उन प्रकारों से करें, जो उन पर लागू नहीं होती beforefieldinit
हैं, जहां पहले वास्तविक उपयोग से ठीक पहले टाइप आरंभीकरण होता है ।
तो, मान लीजिए कि हमारे पास है:
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
यदि दोनों प्रकारों ने beforefieldinit
उन पर लागू किया है (जो कि सी # में वे डिफ़ॉल्ट रूप से करते हैं जब तक कि प्रकार में एक स्थिर निर्माता नहीं है), तो वे दोनोंDoSomething
विधि के प्रारंभ में प्रारंभ हो जाएंगे (आमतौर पर - यह गारंटी नहीं है)। यदि उनके पास नहीं है, beforefieldinit
तो उनमें से केवल एक को ध्वज के आधार पर आरंभ किया जाएगा।
यही कारण है कि सिंगलटन पैटर्न को लागू करते समय एक स्थिर कंस्ट्रक्टर (यहां तक कि एक खाली!) का उपयोग करना आम है ।
ऐसा लगता है कि यह 4.6 में बदलने जा रहा है
beforefieldinit
या नहीं)?