2009-03-07 10 views
12

मैंने पढ़ा है कि संकलित करने के लिए अप्रयुक्त संदर्भ makes no difference को हटा रहा है क्योंकि यह उन विधानसभाओं को अनदेखा करता है जिन्हें कोड में संदर्भित नहीं किया जा रहा है।"अप्रयुक्त संदर्भों को हटाएं" का उद्देश्य क्या है

लेकिन मुझे विश्वास करना मुश्किल लगता है क्योंकि, Removing unused references का वास्तविक उद्देश्य क्या है? यह उत्पन्न असेंबली के आकार या अन्यथा किसी भी ध्यान देने योग्य प्रभाव नहीं है। या यह स्मार्ट व्यवहार C# कंपाइलर (csc.exe) तक सीमित है और vbc.exe के लिए निहित नहीं है?

यदि यह कार्यक्षमता इतना बेकार है, तो ReSharper यह एक सुविधा के रूप में क्यों पेश करता है? यह विजुअल स्टूडियो प्रोजेक्ट कॉन्फ़िगरेशन संवाद के भीतर क्यों प्रदान किया जाता है?

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

उत्तर

14

यह सीएलआर को रनटाइम पर संदर्भित मॉड्यूल को लोड करने से रोकता है। यह स्टार्टअप समय को कम करेगा (क्योंकि प्रत्येक मॉड्यूल को लोड करने में समय लगता है)। मॉड्यूल के आकार के आधार पर यह स्टार्टअप समय को ध्यान में रख सकता है।

एक तरीका यह परीक्षण करने के लिए, एक परीक्षण WinForms प्रोजेक्ट बनाने के लिए एक विधानसभा है कि इस्तेमाल नहीं किया है (जैसे, System.Web) तो चलाने के लिए और निष्पादन योग्य (जैसे, F5) को संलग्न करने के लिए एक संदर्भ जोड़ने के लिए। लोड मॉड्यूल देखें (डीबग -> विंडोज़ -> मॉड्यूल) और आप देखेंगे कि संदर्भित असेंबली लोड की गई थी।

यदि आप इसके बारे में सोचते हैं, तो सीएलआर के लिए यह निर्भर करना मुश्किल होगा कि निर्भरता (यह एक संदर्भ के रूप में प्रकट होने पर निर्भरता के रूप में है) वास्तव में उपयोग किया जाता है ... खासकर जब से कुछ कोड पथों का निष्पादन अग्रिम में ज्ञात नहीं किया जा सकता है ...

+1

कैसे CLR रनटाइम पर एक मॉड्यूल जिसका संदर्भ एक संकलक अनुकूलन द्वारा हटा दिया गया था लोड करने के लिए जा रहा है? मुझे यहां क्या समझ नहीं आ रहा है? – Dan

+0

@Dan - मैं भी समझ में नहीं आता क्यों इस सवाल का जवाब तो कई upvotes मिला है, से मैं क्या अन्य पदों पर पढ़ा है संकलक अंतिम आउटपुट में विधानसभा संदर्भ नहीं डाल देगा, अगर वह उपयोग नहीं किया जाता। संदर्भित असेंबली केवल जेआईटी द्वारा पहली कॉल पर उन्हें एक विधि के लिए लोड किया जाएगा। भारित मॉड्यूल विंडो जो यह उत्तर सबूत के रूप में लाती है, सभी संदर्भ दिखा सकती है क्योंकि यह डीबग मोड पर है। – BornToCode

+0

@BornToCode इसके अलावा, अगर 'यह मुश्किल CLR निर्धारित करने के लिए किया जाए या नहीं एक निर्भरता है वास्तव में used', तो कैसे करता है सब पर" अप्रयुक्त संदर्भ निकाल दें "काम [है]? निर्धारण किया जाए या नहीं एक संदर्भ प्रयोग किया जाता है सरल है: कोई कोड कुछ भी संदर्भ देता है कि अगर विधानसभा के नाम स्थान में है, तो यह अप्रयुक्त है। – Dan

12

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

+0

धन्यवाद, क्रिस्टोफ, लेकिन सवाल बनी हुई है ... कैसे/क्यों यह बेहतर है? – Cerebrus

+2

क्योंकि आपके स्रोत फ़ाइलों फूला हुआ इच्छा अप्रयुक्त कोड/आयात नहीं किया जाएगा और इसलिए पढ़ने और समझने में आसान हो जाएगा यह बेहतर है। इसके अतिरिक्त, मुझे लगता है कि संकलक के पास कम काम होगा और संकलन थोड़ा तेज़ होगा। (मैं उस के बारे में 100% यकीन नहीं है और इस संकलक विशिष्ट है) –

8

विजुअल स्टूडियो 2008 में निर्देशों का उपयोग करके अप्रयुक्त को हटाने की सुविधा भी है।

अप्रयुक्त कोड को हटाने से कोड neater बनाता है, लेकिन आप विवादों के जोखिम को भी कम कर सकते हैं। कभी-कभी अलग-अलग असेंबली में समान नाम वाले वर्ग होते हैं। उदाहरण के लिए, System.Drawing और System.Web.UI.WebControls दोनों में Image कक्षा है। यदि आप दोनों नामस्थानों के लिए निर्देशों का उपयोग कर रहे हैं और छवि वर्ग का उपयोग करना शुरू करते हैं, तो संकलक यह नहीं बता सकता कि इनमें से किस का उपयोग करना है।

+0

+1: संघर्ष का खतरा – Sung

6

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

सी # कंपाइलर वास्तव में उपयोग किए जाने वाले असेंबली के लिए आपके संकलित असेंबली के मेटाडेटा में केवल उत्सर्जित करने के लिए पर्याप्त स्मार्ट है। इसलिए आप उन असेंबली के लिए देशी छवियां उत्पन्न नहीं करेंगे जिन्हें आप Ngen.exe चलाते समय उपयोग नहीं करते हैं। जेआईटी कंपाइलर किसी भी तरह से प्रभावित नहीं होगा, यह केवल आईएल का अनुवाद करने के लिए आवश्यक असेंबली लोड करता है।

+0

इस मतलब यह है कि जब एक NGENed विधानसभा भरी हुई है सभी संदर्भित विधानसभाओं भी बाद में लोड किए गए हैं को कम? या दूसरे शब्दों में: देशी असेंबली की आलसी लोडिंग संभव नहीं है? कम से कम यही वह है जो मैं देखता हूं जब मैं अपने आवेदन की भारित असेंबली की तुलना करता हूं (जेआईटीएड बनाम एनजीएनएड)। – Yves

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