2015-08-25 10 views
11

MSDN - const (C# reference) का हवाला देते हुए:एक प्रकार को निरंतर मूल्य के रूप में क्यों उपयोग नहीं किया जा सकता है?

एक निरंतर अभिव्यक्ति एक अभिव्यक्ति है कि पूरी तरह से संकलन समय पर मूल्यांकन किया जा सकता है। इसलिए, संदर्भ प्रकारों के स्थिरांक के लिए केवल संभावित मान स्ट्रिंग और शून्य संदर्भ हैं।

के अनुसार: typeof(T) vs. Object.GetType() performance, typeof(T) एक संकलन समय अभिव्यक्ति है।

तो Type क्यों स्थिर मूल्य नहीं हो सकता है?

निम्नलिखित कोड नहीं होगा संकलन:

public const Type INT_TYPE = typeof(int); 
+0

मुझे आश्चर्य है कि आप इस सवाल से क्या पूछते हैं, निश्चित रूप से आप वास्तविक कोड में इस तरह के निरंतर उपयोग नहीं करेंगे? – MarioDS

+0

इस उद्देश्य के लिए मैं इसके बजाय स्थैतिक रूप से पढ़ता हूं। –

उत्तर

5

कॉन्स्टेंट को परिणामी आईएल कोड में शाब्दिक मूल्यों के साथ कंपाइलर द्वारा प्रतिस्थापित किया जाता है।

typeof(int); 

// Becomes: 
L_0000: ldtoken int32 
L_0005: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle) 
0
public const Type INT_TYPE = typeof(int); 

कारण उपरोक्त कोड संकलन नहीं होगा सही कारण MSDN- द्वारा कहा निरंतर का मूल्य समय निर्धारित नहीं किया जा सकता है आवेदन संकलित है। टाइपऑफ (int) का उपयोग करने के लिए निरंतर रनटाइम पर मान निर्धारित करने की आवश्यकता होती है। सिद्धांत रूप में, .NET उपरोक्त कथन को संकलित करने की अनुमति दे सकता है, लेकिन फिर यह शब्द की सख्त भावना में स्थिर नहीं होगा।

2

MSDN से::

स्थिरांक संख्याएं, बूलियन मूल्यों, तार, या एक अशक्त संदर्भ हो सकता है लेकिन typeof एक विधि कॉल है।

स्थिरांक मूल रूप से आदिम मूल्यों तक ही सीमित हैं जिन्हें संकलन-प्रकार पर बाइनरी मान के रूप में दर्शाया जा सकता है (क्योंकि इसे संकलित होने पर क्लाइंट कोड में "इंजेक्शन" दिया जाता है)। चूंकि Typeवर्ग है जिसमें कई गुण हैं, वहां एक साधारण बाइनरी प्रतिनिधित्व नहीं है जिसे क्लाइंट कोड में "बेक किया जा सकता है"।

1

सी # कंपाइलर और आईएल निश्चित रूप से कुछ स्थितियों में निरंतर अभिव्यक्ति के रूप में प्रकारों का समर्थन करते हैं। गुण को देखो, वे इस एक बहुत का उपयोग करें:

[DebuggerTypeProxy(typeof(Mscorlib_CollectionDebugView<>))] 

ऊपर लाइन निम्नलिखित आईएल कोड को संकलित प्रकार, संकलक उत्पन्न कोड में स्ट्रिंग के रूप एम्बेडेड है:

.custom instance void System.Diagnostics.DebuggerTypeProxyAttribute::.ctor(class System.Type) = (
    01 00 39 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 
    74 69 6f 6e 73 2e 47 65 6e 65 72 69 63 2e 4d 73 
    63 6f 72 6c 69 62 5f 43 6f 6c 6c 65 63 74 69 6f 
    6e 44 65 62 75 67 56 69 65 77 60 31 00 00 
) 

आप का निरीक्षण किया तो द्विआधारी डेटा, आप देखेंगे कि यह किसी भी असेंबली पहचान के बिना पूरी तरह से योग्य वर्ग का नाम है (System.Collections.Generic.Mscorlib_CollectionDebugView`1)।

अपने प्रश्न का उत्तर देने के लिए: मुझे कोई तकनीकी कारण नहीं दिख रहा है कि यह क्यों संभव नहीं होना चाहिए, और न ही मैं संगतता विचारों की कल्पना कर सकता हूं जो इसे रोकते हैं क्योंकि कोई असेंबली संदर्भ धारावाहिक नहीं है और इसलिए डीएलएल इस प्रकार की घोषणा अभी भी अपडेट किया जा सकता है पहले संकलित प्रकार को संदर्भित किए बिना इसे प्रभावित किए बिना।

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

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