2012-04-19 22 views
31

मैं हाल ही में की खोज में ConditionalWeakTable<TKey,TValue> कक्षा में आया हूं जो here और here उत्तरों में सुझाए गए अनुसार कमजोर संदर्भों का उपयोग करता है।सशर्त WeakTable <TKey, TValue> गैर-कंपाइलर उद्देश्यों के लिए उपयोग किया जाना चाहिए?

आप वर्ग पा सकते हैं ... System.Runtime.CompilerServices नाम स्थान में:

वहाँ a definitive MSDN article कौन सी क्लास शुरू की है और जिसमें कहा गया है। यह कंपाइलर सर्विसेज में है क्योंकि यह एक सामान्य उद्देश्य शब्दकोश प्रकार नहीं है: हम इसके लिए केवल कंपाइलर लेखकों द्वारा उपयोग किए जाने का इरादा रखते हैं।

और बाद में पुन:

... सशर्त कमजोर तालिका एक सामान्य प्रयोजन संग्रह करने का इरादा नहीं है ... लेकिन अगर आप अपनी खुद की और जरूरत के एक .NET भाषा में लिख रहे हैं वस्तुओं को गुणों को संलग्न करने की क्षमता का खुलासा करने के लिए आपको निश्चित रूप से सशर्त कमजोर तालिका में देखना चाहिए।

इस के साथ लाइन में, वर्ग के MSDN प्रविष्टि विवरण में लिखा है:

compilers सक्षम बनाता है गतिशील रूप से प्रबंधित वस्तुओं को वस्तु क्षेत्रों संलग्न करने के लिए।

तो स्पष्ट रूप से यह मूल रूप से एक बहुत ही विशिष्ट उद्देश्य के लिए बनाया गया था - डीएलआर की सहायता के लिए, और System.Runtime.CompilerServices नेमस्पेस इसका प्रतीक है। लेकिन ऐसा लगता है कि सीएलआर के भीतर भी इसका व्यापक उपयोग हुआ है। यदि मैं के ILSpy में संदर्भों की खोज करता हूं, उदाहरण के लिए, मैं देख सकता हूं कि एमईएफ कक्षा CatalogExportProvider और आंतरिक WPF DataGridHelper कक्षा में दूसरों के बीच उपयोग किया जाता है।

मेरा सवाल यह है कि संकलक लेखन और भाषा उपकरण के बाहर ConditionalWeakTable का उपयोग करना ठीक है, और भविष्य में .NET संस्करणों में महत्वपूर्ण ओवरहेड या कार्यान्वयन के कार्यान्वयन के संदर्भ में ऐसा करने में कोई जोखिम है या नहीं। (या इसे टाला जाना चाहिए और इसके बजाय this one जैसे कस्टम कार्यान्वयन का उपयोग किया जाना चाहिए)।

है भी आगे here, here और here कैसे ConditionalWeakTableephemerons (System.Runtime.Compiler.Services. DependentHandle के माध्यम से) के एक छिपे हुए CLR कार्यान्वयन के उपयोग कुंजी और मूल्यों के बीच चक्र की समस्या से निपटने के लिए बनाता है, और यह कितनी आसानी से पूरा नहीं किया जा सकता है के बारे में पढ़ एक कस्टम तरीके से।

उत्तर

22

मुझे ConditionalWeakTable का उपयोग करने में कुछ भी गलत नहीं दिख रहा है। यदि आपको अफेयर्स की आवश्यकता है, तो आपके पास बहुत अधिक विकल्प नहीं है।

मुझे नहीं लगता कि भविष्य .NET संस्करण एक समस्या होगी - भले ही केवल कंपेलर इस वर्ग का उपयोग करेंगे, माइक्रोसॉफ्ट अभी भी मौजूदा बाइनरी के साथ संगतता को तोड़ने के बिना इसे बदल नहीं सकता है।

ओवरहेड के लिए - निश्चित रूप से सामान्य शब्दकोश की तुलना में ओवरहेड होगा। कई DependentHandle एस होने के कारण शायद WeakReference एस सामान्य संदर्भों से अधिक महंगे हैं (जीसी को यह देखने के लिए अतिरिक्त काम करना है कि उन्हें बाहर निकालने की आवश्यकता है या नहीं)। लेकिन यह तब तक कोई समस्या नहीं है जब तक आपके पास बहुत सारी प्रविष्टियां नहीं हों।

+0

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

+0

मैं वास्तव में सशर्त वीकटेबल की उपलब्धता के बारे में उत्साहित था, लेकिन मैंने इसे दस्तावेज़ीकरण में देखा: "आप ऑब्जेक्ट.गेटहाशकोड को ओवरराइड करके समानता तुलना को नियंत्रित नहीं कर सकते हैं ताकि एक कुंजी के लिए हैश कोड स्पष्ट रूप से सेट किया जा सके। सशर्त वेबकैबल <टीके, टीवीएयू> कक्षा नहीं है हैश कोड की गणना करने के लिए ऑब्जेक्ट.गेटहाशकोड विधि का उपयोग करें, और इसलिए ऑब्जेक्ट.गेटहाशकोड ओवरराइड नहीं करता है। " - यह मेरे उद्देश्यों के लिए उपयोगी नहीं है। :( – ctrlplusb

+6

@ सेन: कुंजियों के लिए संदर्भ पहचान के अलावा किसी अन्य चीज़ का उपयोग करने का कोई तरीका नहीं है, क्योंकि यह जानना असंभव होगा (समस्या निवारण) जब कोड को कुंजी प्रदान करने के लिए अब संभव नहीं था संग्रह में किसी आइटम से मेल खाना चाहिए। – supercat