9

मैं दृश्य स्टूडियो 2013 मैं कुछ भयानक कोड किसी और के द्वारा छोड़ दिया है, जो लगभग विशेष रूप से वैश्विक चर का उपयोग करता दोबारा काम कर रहा हूँ, और कहा कि साफ तो मैं प्रत्येक कार्य ठीक से समझाया जा कर सकते हैं और के बाहर प्रभाव पैदा नहीं करने की कोशिश कर उपयोग कर रहा हूँ इसमें क्या पारित किया जाता है (या उससे लौटाया जाता है)।सी # में मौजूदा दायरे के बाहर परिभाषित चर कैसे खोजें?

वहाँ किसी भी तरह से आसानी से जिसमें वे इस्तेमाल किया जा रहा चर जो दायरे से बाहर परिभाषित कर रहे हैं के लिए पूरी परियोजना की जाँच करने के है?

मुझे पता है कि मैं एक चर पर क्लिक कर सकता हूं, और SHIFT+F12 मुझे उस व्यक्तिगत चर के लिए उपयोग मिलेगा, लेकिन मैं पूरी परियोजना में ऐसे सभी उपयोग ढूंढना चाहता हूं, क्योंकि समस्या वास्तव में खराब है ... यह नहीं है सिर्फ एक या दो वैश्विक चर, मैं दर्जनों बात कर रहा हूँ। इस कार्यक्रम के प्रवाह को समझने की कोशिश कर रहा है और इसकी स्थिति आपको पीने के लिए पर्याप्त है!

+0

नहीं कि सिर्फ सदस्य चर हो सकता है? जब तक आप उत्परिवर्तित पैरामीटर के बारे में भी चिंतित न हों? –

+3

आर # आपकी मदद कर सकता है। यह सुनिश्चित नहीं है कि इसके लिए अंतर्निहित फ़ंक्शन है या नहीं। @ मार्कब्रेकेट, ओपी सदस्य चर के बारे में बात कर रहा है जिसे सदस्य चर नहीं होना चाहिए, क्योंकि इन्हें केवल एक विधि के अंदर उपयोग किया जाता है। – bzlm

+0

@bzlm, लगभग। वे वैश्विक चर हैं, जिनका उपयोग दर्जनों कार्यों के बीच वैश्विक स्तर पर राज्य को पारित करने के लिए किया जाता है। इसलिए मैं प्रत्येक फ़ंक्शन में वेरिएबल को स्थानीयकृत करने की कोशिश कर रहा हूं जहां आवश्यक है और इसके बजाय पैरामीटर का उपयोग करें, इसलिए प्रोग्राम की स्थिति और उसके डेटा को समझना आसान है, साफ-सफाई करने और सभी ग्लोबल्स को दूर करने के लिए। – eidylon

उत्तर

1

एक उपकरण पहले से ही एक पेड़ के प्रारूप में यह करता है कि वहाँ होना चाहिए, लेकिन हमेशा की तरह संदिग्ध में से कोई भी नृत्य Usages का पता लगाएं बिना यह है लगता है।

तो, यहां सभी सदस्य चर खोजने, तो विधियों के माध्यम से जा रहा है और क्या वे उन्हें स्पर्श पता लगाना द्वारा प्रतिबिंब API का उपयोग करके एक प्रयास है।

आप मूल रूप से, इस बिंदु पर आईएल पर देख रहे हैं तो जब तक आप अपने आप को पार्स नियम लगाने के लिए चाहते हैं आप सेसिल की तरह एक disassembler का उपयोग करना चाहेंगे। मैं इस deprecated single file implementation cause it's easy का उपयोग कर रहा हूँ। Roslyn विश्लेषक या JustDecompile प्लगइन की तरह कुछ और मार्ग होगा, लेकिन मुझे कोई अनुभव नहीं है।

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

तो, मूल रूप से आप प्रतिबिंब के साथ साथ एक आईएल पाठक चर से एक नक्शा बनाने के लिए उपयोग -> विधियों (आप अन्य तरीके से भी जा सकते हैं, लेकिन यह शायद कम मूल्यवान है):

var variables = typeof(SmallBallOfMud).GetFields(BindingFlags.Instance | BindingFlags.NonPublic); 
var methods = typeof(SmallBallOfMud).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic); 

var d = new Dictionary<string, List<string>>(); 
foreach (var v in variables) d.Add(v.Name, new List<string>()); 

// this particular disassembler chokes on externally implemented methods 
foreach (var m in methods.Where(m => (m.MethodImplementationFlags | MethodImplAttributes.IL) == 0)) { 
    var instructions = MethodBodyReader.GetInstructions(m); 

    foreach (var i in instructions) { 
     // we'll only check for direct field access here 
     var f = i.Operand as FieldInfo; 
     if (f == null) continue;    
     d[f.Name].Add(m.Name); 
    } 
} 

हमारे परिणाम होगा जैसे:

state1: Method1 (1), Method2 (1) 
state2: Method2 (2) 
state3: Method1 (1), Method2 (2) 

जो "state3" पढ़ने के लिए है "Method1" एक बार, और "Method2" द्वारा दो बार किया जाता है।

+0

एक गिस्ट डब्ल्यू/कोड: https://gist.github.com/mbrackett/335e18071bbb17f08ce2 –

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