कई एमएसआईएल लिस्टिंग में, मैंने निम्नलिखित देखा है:
System.Nullable`1<!0> etc ...
या
class !0 etc ...
!0
इन परिस्थितियों में क्या अर्थ है?
जवाबों:
यह एक .NET असेंबली को देखने के लिए आपके द्वारा उपयोग किए जाने वाले डिकंपाइलर का क्विकर है। यह ildasm.exe का व्यवहार है, रिफ्लेक्टर या ILSpy जैसे अन्य लोगों को यह अधिकार मिलता है। Microsoft प्रोग्रामर जिसने इसे लिखा था उसने शॉर्टकट लिया, वह IL से एक स्ट्रिंग बनाता है जो मेटाडेटा में टाइप तर्क नाम देखने के लिए अतिरिक्त कोड लिखे बिना, जिस तरह से एनकोड किया गया है, उसी प्रकार का तर्क प्रदर्शित करता है ।
आपको !n
जेनेरिक प्रकार के n-वें प्रकार तर्क के रूप में पढ़ने की आवश्यकता है । कहाँ! 0 का अर्थ है "प्रथम प्रकार का तर्क"; 1 का अर्थ है "दूसरे प्रकार का तर्क", आदि। Nullable <> के लिए, आप जानते हैं कि MSDN लेख से '0' का अर्थ 'T' है।
आपका सामना कुछ इस तरह से भी हो सकता है !!T
। दो विस्मयादिबोधक चिह्न एक सामान्य विधि के लिए एक प्रकार का तर्क दर्शाते हैं । इस बार, ildasm.exe उपयोग करने के बजाय टाइप तर्क नाम को देखता है !!0
। प्रोग्रामर ने जेनेरिक प्रकारों पर शॉर्टकट क्यों लिया, लेकिन जेनेरिक तरीकों पर नहीं, रिवर्स-इंजीनियर के लिए कठिन है। Ildasm एक बहुत विचित्र कार्यक्रम है और C ++ कोडिंग शैली में लिखा गया है जो .NET में अन्य C ++ कोड से बहुत अलग है। अनुशासित नहीं, गैर-शून्य बाधाओं के रूप में यह एक आंतरिक काम था :)
"Nullable" पर `1 प्रत्यय सामान्य प्रकार के नामों के लिए एक सामान्य एन्कोडिंग है, यह इंगित करता है कि सामान्य प्रकार में एक प्रकार का तर्क है। दूसरे शब्दों में, Nullable <> के लिए आप कभी नहीं देखेंगे! 1 का उपयोग किया जा रहा है।
तो बस !0
"टी" के रूप में पढ़ें । या एक बेहतर डीकंपोजर का उपयोग करें।
यह एक सामान्य प्रकार का पैरामीटर है।
वे स्थितिगत हैं।
यह देखने के लिए कुछ सामान्य कोड को डिकम्पाइल करें कि उनका उपयोग कैसे किया जाता है (IL बनाम C # की तुलना करें)।
ldfld class System.Collections.Generic.Dictionary``2<!0, !1> valuetype System.Collections.Generic.Dictionary``2/Enumerator<!TKey, !TValue>::dictionary
या call instance void class System.Collections.Generic.Dictionary``2<!TKey, !TValue>::Insert(!0, !1, bool)
। कच्चे आईएल केवल वैसे भी स्थितीय तर्क का उपयोग करता है, हालांकि - !TKey
पहले से ही आईएल को अधिक पठनीय बनाने का प्रयास है। शायद यह हमेशा अच्छी तरह से काम नहीं करता है? ECMA युक्ति हमेशा स्थितीय !0
/ !00
साथ ही उपयोग करती है ।
!T
और!!T
, इसके आधार पर अगर सामान्य पैरामीटर युक्त वर्ग या विधि का है ... यदि मैं ildasm का उपयोग करता हूं