2011-12-09 15 views
22

मैं सी # के लिए एक सच्चे WeakKeyedDictionary<,> के विवरणों को नट करने की कोशिश कर रहा हूं ... लेकिन मैं कठिनाइयों में भाग रहा हूं।क्या सी # में एक कमजोर कमजोर कुंजीपटल शब्दकोश बनाना संभव है?

मुझे एहसास है कि यह एक गैर-मामूली कार्य है, लेकिन WeakKeyedKeyValuePair<,> घोषित करने में असमर्थता (जहां जीसी केवल पहुंच योग्य है तो जीसी केवल मूल्य संदर्भ का पालन करती है) यह असंभव बनाता है।

वहाँ मैं देख रहा हूँ दो मुख्य समस्याएं हैं:

  1. हर कार्यान्वयन मैं अब तक देखा है मूल्यों ट्रिम नहीं है कुंजी एकत्र किया गया है के बाद। इसके बारे में सोचें - इस तरह के एक शब्दकोश का उपयोग करने के मुख्य कारणों में से एक है उन मूल्यों को रोकने के लिए (केवल चाबियाँ नहीं!) क्योंकि वे पहुंच योग्य नहीं हैं, लेकिन यहां उन्हें मजबूत संदर्भों के आधार पर छोड़ दिया गया है।

    हां, शब्दकोश से पर्याप्त जोड़ें/हटाएं और अंत में उन्हें बदल दिया जाएगा, लेकिन यदि आप नहीं करते हैं तो क्या होगा?

  2. एक काल्पनिक WeakKeyedKeyValuePair<,> के बिना (या जीसी को केवल मूल्य को चिह्नित करने के लिए कहने का दूसरा माध्यम है यदि कुंजी पहुंच योग्य है) किसी भी मूल्य जो इसकी कुंजी को संदर्भित करता है, कभी भी एकत्र नहीं किया जाएगा। मनमाने ढंग से मूल्यों को संग्रहीत करते समय यह एक समस्या है।

समस्या 1 एक काफी गैर आदर्श/hackish तरह से घेरने की कोशिश की जा सकता है: जीसी सूचनाएं का उपयोग पूरा करने के लिए एक पूर्ण जीसी के लिए इंतजार करना है, और फिर साथ जाने और एक अन्य सूत्र में शब्दकोश छांटना। यह मैं अर्ध-ठीक हूँ।

लेकिन समस्या 2 ने मुझे स्टंप किया है। मुझे एहसास है कि यह आसानी से "ऐसा मत करो" द्वारा गिनती है, लेकिन यह मुझे आश्चर्यचकित कर रहा है - क्या यह समस्या हल करने के लिए भी संभव है?

उत्तर

28

ConditionalWeakTable<TKey, TValue> Class पर एक नज़र डालें।

प्रबंधित वस्तुओं पर गतिशील रूप से ऑब्जेक्ट फ़ील्ड संलग्न करने के लिए कंपाइलर्स सक्षम करता है।

यह मूलतः एक शब्दकोश जहां दोनों कुंजी और मान एक WeakReference हैं, और मूल्य के रूप में लंबे समय के रूप कुंजी जीवित है जिंदा रखा है।

नोट! समानता तुलना करने के लिए यह कक्षा GetHashCode और Equals का उपयोग नहीं करती है, यह ReferenceEquals का उपयोग करती है।

+0

अच्छा खोज, सबसे दिलचस्प! यह कैसे लागू किया जाता है मुझे आश्चर्य है? यह जानने के बिना समस्या बन जाती है "क्या वास्तव में WeakValuedDictionary <,> बनाना संभव है"। मैं परावर्तक में खोदूँगा और देख सकता हूं कि क्या मैं इसे समझ सकता हूं ... – Mania

+3

क्या शर्म की बात है, ऐसा प्रतीत होता है कि यह एक कार्यान्वयन के लिए आंतरिक .NET-magic "निर्भर हैंडल" पर निर्भर करता है .. इसके अतिरिक्त यह गेटहैशकोड और इक्वल्स को अनदेखा करता है। , इसे सर्वश्रेष्ठ रूप से एक घटिया शब्दकोश बनाते हुए :(। इसके अलावा निर्भरांकहैंड तक पहुंच के बिना, समस्या अब एक वीकवेल्यूड डिक्शनरी <,> को परिभाषित करने के लिए स्थानांतरित हो गई है। मुझे लगता है कि यह उतना करीब हो सकता है जितना हम प्राप्त कर सकते हैं .. – Mania

+7

@Mania निर्भरता हैडल सीएलआर कार्यान्वयन है [ephemerons] (http://en.wikipedia.org/wiki/Ephemeron) जो जीसी सहयोग के बिना लागू करना असंभव है। इसे जीसीएचंडल की तरह सार्वजनिक किया जाना चाहिए था। अगर आपको प्रतिबिंब की चाल नहीं है तो आप स्थिर हो सकते हैं प्रतिनिधियों में सीएलआर विधियों और अपने स्वयं के आश्रित हैंडल और WeakValuedDictionary लागू करें। .NET संदर्भ स्रोत (जो सार्वजनिक है) का अध्ययन करने के लिए सावधान रहें, या कुछ decompiler का उपयोग करें, क्योंकि यह मुश्किल दौड़ conditio है एनएस। – Zarat