मैं हाल ही में की खोज में 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 कार्यान्वयन के उपयोग कुंजी और मूल्यों के बीच चक्र की समस्या से निपटने के लिए बनाता है, और यह कितनी आसानी से पूरा नहीं किया जा सकता है के बारे में पढ़ एक कस्टम तरीके से।
धन्यवाद, मैं इसे उत्तर के रूप में चिह्नित करूंगा। मुझे लगता है कि आप सही हैं - मुझे एक शब्दकोश चाहिए जो कमजोर संदर्भों का उपयोग करता है, इसलिए सशर्त वाइकटेबल को किसी अन्य कार्यान्वयन की तुलना में किसी भी ओवरहेड को पेश नहीं करना चाहिए जो कमजोर संदर्भों का उपयोग करता है, जिसमें इफेमरन्स का उपयोग करने के अतिरिक्त लाभ के साथ। – Riko
मैं वास्तव में सशर्त वीकटेबल की उपलब्धता के बारे में उत्साहित था, लेकिन मैंने इसे दस्तावेज़ीकरण में देखा: "आप ऑब्जेक्ट.गेटहाशकोड को ओवरराइड करके समानता तुलना को नियंत्रित नहीं कर सकते हैं ताकि एक कुंजी के लिए हैश कोड स्पष्ट रूप से सेट किया जा सके। सशर्त वेबकैबल <टीके, टीवीएयू> कक्षा नहीं है हैश कोड की गणना करने के लिए ऑब्जेक्ट.गेटहाशकोड विधि का उपयोग करें, और इसलिए ऑब्जेक्ट.गेटहाशकोड ओवरराइड नहीं करता है। " - यह मेरे उद्देश्यों के लिए उपयोगी नहीं है। :( – ctrlplusb
@ सेन: कुंजियों के लिए संदर्भ पहचान के अलावा किसी अन्य चीज़ का उपयोग करने का कोई तरीका नहीं है, क्योंकि यह जानना असंभव होगा (समस्या निवारण) जब कोड को कुंजी प्रदान करने के लिए अब संभव नहीं था संग्रह में किसी आइटम से मेल खाना चाहिए। – supercat