2010-03-24 14 views
96

के बारे में जानने के लिए कहां है यदि आपने कभी भी प्रतिबिंबक का उपयोग किया है, तो आपने शायद देखा है कि सी # कंपाइलर प्रकार, विधियों, फ़ील्ड, और स्थानीय चर उत्पन्न करता है, जो डीबगर द्वारा 'विशेष' डिस्प्ले के लायक हैं। उदाहरण के लिए, 'सीएस $' से शुरू होने वाले स्थानीय चर उपयोगकर्ता को प्रदर्शित नहीं होते हैं। अज्ञात तरीकों के बंद प्रकार, स्वचालित गुणों के बैकिंग फ़ील्ड आदि के लिए अन्य विशेष नामकरण सम्मेलन हैं।वीएस डीबगर 'जादू नाम'

मेरा प्रश्न: इन नामकरण सम्मेलनों के बारे में कहां से सीखना है? क्या किसी को कुछ दस्तावेज के बारे में पता है?

मेरा उद्देश्य पोस्टशर्प 2.0 को समान सम्मेलनों का उपयोग करना है।

उत्तर

190

ये कंपाइलर के अनियंत्रित कार्यान्वयन विवरण हैं, और किसी भी समय परिवर्तन के अधीन हैं। (अद्यतन: वर्तमान जानकारी के लिए सी # स्रोतों में GeneratedNames.cs देखें; नीचे दिए गए विवरण कुछ हद तक है बाहर का तारीख।)

हालांकि, बाद से मैं एक अच्छा लड़का हूँ, यहां वे विवरण में से कुछ हैं:

यदि आपके पास एक अप्रयुक्त स्थानीय चर है जिसे ऑप्टिमाइज़र हटा देता है, तो हम इसके लिए पीडीबी में किसी भी तरह से डीबग जानकारी छोड़ देते हैं। हमने प्रत्यय __Deleted$ को इस तरह के चर पर फंस गया ताकि डीबगर जानता है कि वे स्रोत कोड में थे लेकिन बाइनरी में प्रतिनिधित्व नहीं करते थे।

कंपाइलर द्वारा आवंटित अस्थायी परिवर्तनीय स्लॉट पैटर्न सीएस $ एक्स $ वाई के साथ नाम दिए गए हैं, जहां एक्स "अस्थायी प्रकार" है और वाई अब तक आवंटित अस्थायी संख्याओं की संख्या है। अस्थायी प्रकार के होते हैं: 8 और 264 के बीच

0 --> short lived temporaries 
1 --> return value temporaries 
2 --> temporaries generated for lock statements 
3 --> temporaries generated for using statements 
4 --> durable temporaries 
5 --> the result of get enumerator in a foreach 
6 --> the array storage in a foreach 
7 --> the array index storage in a foreach. 

अस्थाई प्रकार बहुआयामी सरणियों के लिए अतिरिक्त सरणी सूचकांक भंडार हैं।

264 से ऊपर अस्थायी प्रकार का उपयोग स्ट्रिंग को ठीक करने वाले निश्चित कथन से जुड़े अस्थायी लोगों के लिए किया जाता है।

1 --> the iterator state ("state") 
2 --> the value of current in an iterator ("current") 
3 --> a saved parameter in an iterator 
4 --> a hoisted 'this' in an iterator ("this") 
5 --> a hoisted local in an iterator 
6 --> the hoisted locals from an outer scope 
7 --> a hoisted wrapped value ("wrap") 
8 --> the closure class instance ("locals") 
9 --> the cached delegate instance ("CachedAnonymousMethodDelegate") 
a --> the iterator instance ("iterator") 
b --> an anonymous method 
c --> anonymous method closure class ("DisplayClass") 
d --> iterator class 
e --> fixed buffer struct ("FixedBuffer") 
f --> anonymous type ("AnonymousType") 
g --> initializer local ("initLocal") 
h --> query expression temporary ("TransparentIdentifier") 
i --> anonymous type field ("Field") 
j --> anonymous type type parameter ("TPar") 
k --> auto prop field ("BackingField") 
l --> iterator thread id 
m --> iterator finally ("Finally") 
n --> fabricated method ("FabricatedMethod") 
o --> dynamic container class ("SiteContainer") 
p --> dynamic call site ("Site") 
q --> dynamic delegate ("SiteDelegate") 
r --> com ref call local ("ComRefCallLocal") 
s --> lock taken local ("LockTaken") 

जादुई नाम पैदा करने के लिए पैटर्न है: P<N>C__SI जहां:

  • पी कैश्ड प्रतिनिधियों और प्रदर्शन वर्ग उदाहरण के लिए सीएस $ है, खाली

    विशेष संकलक-जनरेटेड नाम के लिए उत्पन्न कर रहे हैं अन्यथा।

  • एन, मूल बात से संबंधित नाम है, यदि कोई हो
  • सेल्सियस से ऊपर
  • एस सूचीबद्ध रों के माध्यम से चरित्र 1 है एक वर्णनात्मक प्रत्यय ("वर्तमान", "राज्य", और इतने पर) ताकि है मेटाडेटा पढ़ने के दौरान आपके पास याद रखने वाली तालिका नहीं है।
  • मैं एक वैकल्पिक अद्वितीय संख्या
+2

धन्यवाद! मैं देखूंगा कि क्या मैं पोस्टशर्प क्लोजर क्लासेस को अच्छी तरह से व्यवहार कर सकता हूं जैसे सी # कंपाइलर उत्पन्न करता है! –

+3

एक टिकाऊ अस्थायी क्या है? – SLaks

+7

@ स्लक्स: एक अल्पकालिक अस्थायी के विपरीत। टिकाऊ अस्थायी अनिवार्य रूप से नाम के बिना स्थानीय चर हैं; उनके पास ढेर पर एक विशिष्ट स्थान है जो ढेर के फ्रेम के जीवनकाल के लिए रहता है। अल्पकालिक अस्थायी अस्थायी रूप से स्टैक पर धकेल दिए जाते हैं जब उनके भंडारण की आवश्यकता होती है और फिर जब इसकी आवश्यकता नहीं होती तब पॉप आउट हो जाती है। टिकाऊ अस्थायी डीबग करने के लिए बहुत आसान हैं, लेकिन अस्थायी लोगों के जीवनकाल को अधिक लंबा बना सकते हैं। ऑप्टिमाइज़ेशन बंद होने पर हम टिकाऊ अस्थायी उत्पन्न करते हैं। –