2011-12-19 4 views

उत्तर

7

इन दोनों संरचनाओं का बिंदु कचरा कलेक्टर को संसाधन जारी करने से रोकने और पी/Invoke कॉल समाप्त होने से पहले हैंडल को अमान्य करने से रोकने के लिए है। आपके द्वारा लिंक किए गए दस्तावेज़ से संकेत मिलता है कि ये इंटरऑप मार्शलर द्वारा मान्यता प्राप्त विशेष प्रकार हैं।

मैं प्रलेखन से जो एकत्र करता हूं वह यह है कि HandleRef अनिवार्य रूप से अधिक सामान्य GCHandle संरचना का एक विशेष मामला है।

HandleRef संरचना विशेष रूप से पी/Invoke कोड के साथ उपयोग किए जाने वाले अप्रबंधित संसाधनों को हैंडल लपेटने के लिए है। उदाहरण के लिए, विंडो हैंडल (HWND) या डिवाइस संदर्भ (HDC)। इसमें Handle संपत्ति है जो IntPtr का मान देता है, जो अंतर्निहित सिस्टम के आर्किटेक्चर पर पॉइंटर के आकार का एक पूर्णांक मान है। आप इसे & पर आसानी से उपयोग कर सकते हैं इसे आसानी से संभालने वाले हैंडल प्राप्त कर सकते हैं।

जबकि GCHandle संरचना एक संभाल यह GCHandleType गणन के सदस्यों में से एक का उपयोग कर लिपट प्रकार निर्दिष्ट कर सकते, HandleRef संरचना विशेष रूप से अप्रबंधित संसाधनों के हैंडल रैप करने के लिए डिजाइन किया गया था। जब आप Win32 एपीआई काले बक्से के रूप में व्यवहार करते हैं तो विशेष हैंडल की बजाय, आप सीधे अप्रबंधित स्मृति से निपट रहे हैं, तो आप GCHandle संरचना का उपयोग करेंगे।

या तो इसका उपयोग करना आवश्यक नहीं है। समय-समय पर संसाधन जारी करने से कचरा कलेक्टर को रखने के लिए कोई भी GC.KeepAlive पर कॉल कर सकता है।

और यहां तक ​​कि शायद यह आवश्यक नहीं है। मैं वर्षों से पी/कोड कोड लिख रहा हूं, और मैंने पाया है कि जब यह सही ढंग से लिखा जाता है, तो इन संरचनाओं में से किसी एक की आवश्यकता नहीं होती है। यदि किसी क्लास ऑब्जेक्ट को कचरा इकट्ठा किया जाता है जबकि एपीआई कॉल निष्पादन के बीच में होता है, तो यह आपके एप्लिकेशन में एक बग है। मैं वास्तव में अपवाद के माध्यम से विफलता के अधिसूचित होने के लिए चाहता हूं, इसे छुपाएं।

+0

उत्तर –

+1

के लिए धन्यवाद "मैंने पाया है कि जब यह सही ढंग से लिखा जाता है, तो इन संरचनाओं में से किसी के लिए कोई आवश्यकता नहीं है।" क्या होगा यदि आप ऑब्जेक्ट को एकत्र होने से रोकने के बारे में चिंतित नहीं हैं क्योंकि आप जानते हैं कि प्रबंधित कोड इसे संदर्भित रखेगा, लेकिन आप बस किसी भी कारण से प्रबंधित संदर्भों को स्वीकार/रोक/वापस करने के लिए अप्रबंधित कोड चाहते हैं। उदाहरण का उपयोग केस: स्टैक ओवरफ्लो .com/प्रश्न/32105089 –

0

एक अंतर यह में दी गई है link आपका उल्लेख किया:

HandleRef मान प्रकार, GCHandle की तरह, एक विशेष प्रकार से मान्यता प्राप्त है इंटरऑप मार्शलर। एक सामान्य, nonpinned GCHandle भी असामयिक कचरा संग्रह को रोकता है, फिर भी हैंडलरफ बेहतर प्रदर्शन प्रदान करता है। हालांकि के लिए ऑब्जेक्ट को जीवित रखने के लिए हैंडलरफ का उपयोग करना प्लेटफ़ॉर्म इनवॉक कॉल की अवधि को प्राथमिकता दी जाती है, आप उसी उद्देश्य के लिए जीसी.किप अलाइव विधि का भी उपयोग कर सकते हैं।

+0

हाँ, मुझे लगता है, लेकिन मुझे विस्तृत जानकारी की आवश्यकता है –

+1

@user: आप और अधिक विस्तृत जानकारी चाहते हैं? –

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