2015-02-11 7 views
7

क्या सी # कंपाइलर खाली शून्य विधियों को अनुकूलित करेगा? कुछक्या कंपाइलर खाली विधियों को त्याग देता है?

private void DoNothing() 
{ 
} 

के रूप में अनिवार्य रूप से की तरह, कोई कोड कॉल स्टैक करने के लिए DoNothing जोड़ने और इसे फिर से दूर करने, यह बेहतर नहीं होगा कि इस कॉल दूर अनुकूलन करने के लिए एक तरफ से चलाया जाता है?

उत्तर

18

क्या सी # कंपाइलर खाली शून्य विधियों को अनुकूलित करेगा?

नहीं। उन्हें अभी भी प्रतिबिंब के माध्यम से उपयोग किया जा सकता है, इसलिए यह महत्वपूर्ण है कि विधि स्वयं ही रहती है।

किसी भी कॉल साइट में कॉल भी शामिल होने की संभावना है - लेकिन JIT उन्हें अनुकूलित कर सकता है। ऐसा करने के लिए यह एक बेहतर स्थिति में है। यह मूल रूप से इनलाइनिंग का एक विशेष मामला है, जहां रेखांकित कोड खाली है।

ध्यान दें कि यदि आप किसी अन्य वस्तु पर इसे कहते:

foo.DoNothing(); 

कि, है नहीं नो-सेशन क्योंकि यह जाँच करेगा कि foo में गैर-शून्य है।

+0

आह, मैंने एक विधि को बुलाए जाने के बारे में नहीं सोचा था और इसलिए –

3

कभी नहीं। कंपाइलर को खाली या लिखित नहीं है। यह वही है जो आप लिखते हैं, आप अपने एमएसआईएल में मिलता है। आप ILDASM

enter image description here

3

में यहाँ यह जांच कर सकते हैं आप आप प्रत्येक परियोजना के लिए पोस्ट का निर्माण घटना रोकना और एक आईएल निरीक्षण टूल है जो आपकी उत्पन्न dll को प्रतिबिंबित करेगा चला सकते हैं, अपने प्रकार में हर MethodInfo का निरीक्षण चाहते हैं और अनुरोध करें कि आईएल आईएल पैटर्न की तलाश में केवल आईओएलएल निर्देशों की तरह है, और अवांछित तरीकों को हटा दें।

उदाहरण के लिए: var ilbytes = SomeMethodInfo.GetMethodBody()। GetILAsByteArray();

एक अच्छा obfuscation उपकरण इस तरह से "prune" विधियों जाएगा। preemptive.com/products/dotfuscator/features#pruning - वेस्टन 5 मिनट पहले

आप खाली तरीकों को खोजने और उन्हें फ़ाइल वे परिभाषित या में उपयोग किया जाता से दूर करने के लिए दृश्य स्टूडियो के बाहर से उपकरण का उपयोग कर सकता है

+1

विफल रहा एक अच्छा obfuscation उपकरण इस तरह से "prune" विधियों जाएगा। http://www.preemptive.com/products/dotfuscator/features#pruning – weston

+0

आपने एक अच्छा बिंदु कहा, टिप्पणी के लिए धन्यवाद :) –

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