2011-02-17 4 views
5

मैं प्रतिबिंब के साथ खेल रहा हूं और दुर्घटना से मुझे एहसास हुआ कि मैं एक कॉन्स क्लास चर पर कस्टम फ़ील्ड विशेषता रख सकता हूं, फिर (प्रतिबिंब का उपयोग करके) मैं कक्षा के फ़ील्ड पढ़ता हूं, विशेषता के साथ कॉन्स ढूंढता हूं और क्रियाएं करता हूं। यह ठीक काम कर रहा है।सी # में प्रतिबिंब का उपयोग करके आप एक कॉन्स पर रखी गई विशेषता को क्यों पढ़ सकते हैं?

मुझे उत्सुकता है कि यह ठीक क्यों काम करता है। जब तक मैं गलत नहीं समझता कि कैसे काम करता है, मैंने सोचा कि स्थिरांक "संकलित" थे और संकलन के बाद निरंतर वास्तविक मूल्य बनने के लिए सभी संदर्भ सामने आए। यदि ऐसा है, तो प्रतिबिंब अभी भी कॉन्स्ट मानों को क्यों देख सकता है?

+2

ठीक है, मान लीजिए कि दुनिया ने जिस तरह से कल्पना की थी। ** असेंबली में लगातार एम्बेडेड के लिए मेटाडेटा नहीं होने पर, आप असेंबली में परिभाषित निरंतर मूल्य का उपयोग कैसे कर पाएंगे? ** यह एक अशिष्ट सवाल नहीं है; मुझे वास्तव में दिलचस्पी है कि क्यों लोग प्रोग्रामिंग भाषाओं के बारे में अजीब बातें मानते हैं ताकि हम भविष्य में बेहतर भाषाएं और दस्तावेज़ीकरण कर सकें। –

+0

@ एरिक लिपर्ट: मुझे लगता है कि ऐसा इसलिए है क्योंकि अन्य प्रोग्रामिंग भाषाएं इस तरह से काम करती हैं, खासकर लोग जो पहले आते हैं। मैंने कभी भी .NET में संकलित-बाहर स्थिरांक ग्रहण नहीं किया है, लेकिन अगर कोई उन्हें उल्लेख करता है तो मुझे आश्चर्य नहीं है, क्योंकि यह मेरे ज्ञान के अनुरूप है। डेल्फी या सी। आगे, जैसा कि लोगों ने कहा है, स्थिरांक के बारे में कुछ चीजें संकलित हो जाती हैं, और इससे पहले कि यह स्पष्ट हो जाता है कि आपके द्वारा बनाए गए आगे की प्राप्ति को स्पष्ट किया जाता है कि निरंतर स्वयं को असेंबली से हटाया नहीं जाता है। – Stobor

उत्तर

11

सभी एक const के लिए संदर्भ दूर संकलित कर रहे हैं - const घोषणा ही नहीं। कंपाइलर द्वारा आईएल के हिस्से के रूप में const घोषणाएं उत्सर्जित की जाती हैं।

यहां एक उदाहरण है (ध्यान दें कि आईएल const फ़ील्ड को बरकरार रखता है)।

सी #:

class Foo 
{ 
    const int i = 0; 
} 

आईएल:

.class private auto ansi beforefieldinit Foo 
    extends [mscorlib]System.Object 
{ 
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
    } 


    .field private static literal int32 i = int32(0)  
} 
1

मैंने सोचा था कि स्थिरांक "बाहर संकलित" थे और कहा कि निरंतर के सभी संदर्भ संकलन के बाद निरंतर के वास्तविक मूल्य बन गया। यदि यह मामला

मैं कहूंगा कि यह मामला नहीं है। एक const अभी भी अपनी कक्षा का एक पूर्ण सदस्य है। एक लाइब्रेरी पर विचार करें जो public const का खुलासा करता है। भी हो सकता है कि कोई भी संदर्भ (लाइब्रेरी के भीतर) को 'संकलित' न किया जाए।

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

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