2012-06-07 16 views
9

मैं सभी व्यू मॉडल्स का शब्दकोश बनाना चाहता हूं।वीक रेफरेंस समझ

public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>(); 

इस

vmCollection.Add(name, new WeakReference(viewModel)); 

है जैसे कि यह जोड़ा जा रहा है और इस तरह आवश्यक विधि बुला ..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message); 

मैं एक WeakReference के रूप में इसे बनाए रखने की जरूरत है? अगर मैं इसे WeakReference के रूप में नहीं रखता तो परिणाम क्या हो सकते हैं।

+3

यह जांचना न भूलें कि ऑब्जेक्ट इसे एक्सेस करने से पहले जीवित है या नहीं - WeakReference – Bond

+0

पर आक्रमण करें यदि आप एक संदेश प्रकार समाधान को कार्यान्वित करना चाहते हैं तो क्या आपने प्रिज्म में EventAggregator को देखा है? – slugster

+0

धन्यवाद slugster.I किसी भी प्रकार की निर्भरता से बचने के लिए इसे अपने आप लागू करना चाहते हैं ... –

उत्तर

14

WeakReference का उपयोग न करने का एकमात्र परिणाम यह है कि आपके शब्दकोश में संदर्भ दृश्य मॉडल उदाहरणों को कचरा होने से रोक देगा। WeakReference कचरा संग्रह की अनुमति देता है (माना जाता है कि कहीं और ठोस संदर्भ नहीं हैं)।

एक आइटम कचरा संग्रह के लिए योग्य हो जाता है जब इसका कोई संदर्भ नहीं होता है। WeakReference एक "गणनीय" संदर्भ नहीं बनाता है, इस प्रकार आप इसके लिए एक प्रकार का संदर्भ रख सकते हैं, लेकिन फिर भी यह योग्य होने दें यदि आपका WeakReference एकमात्र चीज है जो इसे देख रहा है।

चाहे आपको इसकी आवश्यकता हो या वास्तव में इस बात पर निर्भर न हो कि आपके व्यू मॉडल के किस प्रकार के जीवन चक्र हैं। अगर उन्हें निपटान की आवश्यकता है या अन्यथा "जाने देना" है, तो आपको WeakReference का उपयोग करने की आवश्यकता हो सकती है या इसके बजाय शब्दकोश से संदर्भ को हटाने का एक तरीका सामने आ सकता है।

जैसा कि मैंने टिप्पणियों में उल्लेख किया है। मैं प्रासंगिक वस्तुओं के जीवन चक्र को स्पष्ट रूप से संभालने के विरोध में WeakReference का उपयोग करने से दूर गलती करता हूं। उन्होंने कहा, वे उपयोगी हैं जब आप प्रासंगिक बिंदुओं पर जीवन चक्र की दृश्यता नहीं रखते हैं। मुझे लगता है कि आपकी स्थिति में, आपके पास आवश्यक दृश्यता होनी चाहिए, क्योंकि ये सभी यूआई परत में हैं, और इस प्रकार का उपयोग करने की कोशिश करनी चाहिए।

दिशानिर्देश MSDN लिंक ऊपर से निकालने:

यहाँ विषय पर कुछ संसाधन हैं लंबे कमजोर संदर्भ

उपयोग केवल जब आवश्यक क्योंकि ऑब्जेक्ट की स्थिति आप है अंतिमकरण के बाद npredictable।

छोटी वस्तुओं के कमजोर संदर्भों का उपयोग करने से बचें क्योंकि सूचक स्वयं बड़ा या बड़ा हो सकता है।

स्मृति प्रबंधन समस्याओं के स्वचालित समाधान के रूप में कमजोर संदर्भों का उपयोग करने से बचें। इसके बजाय, के लिए अपने एप्लिकेशन की ऑब्जेक्ट्स को संभालने के लिए एक प्रभावी कैशिंग नीति विकसित करें।

मेरा मानना ​​है कि अंतिम दिशानिर्देश बिंदु आपकी स्थिति पर लागू होता है।

+0

बहुत बहुत धन्यवाद एडम। अगर मैं सुरक्षित पक्ष पर इसका उपयोग करता हूं तो क्या यह ओवरहेड का कोई भी प्रकार होगा? –

+2

@RaoBHavik ओवरहेड 'वीक रेफरेंस' ऑब्जेक्ट इंस्टेंस की कीमत होगी, और लगातार जांच करने की आवश्यकता है कि संदर्भित ऑब्जेक्ट अभी भी उपयोग योग्य है (जाहिर है, यह आपके द्वारा पिछली बार उपयोग किए जाने के बाद से एकत्र किया जा सकता था)। ऑब्जेक्ट्स के जीवन चक्र को स्पष्ट रूप से संभालने के विरोध में मैं हमेशा उनका उपयोग करने से दूर रहूंगा, लेकिन कभी-कभी आपको जीवन चक्र की दृश्यता नहीं होती है ताकि वे उपयोगी साबित हो सकें। मुझे लगता है कि आपके मामले में आपको दृश्यता होनी चाहिए, इसलिए संभवतः उन्हें उपयोग करने की कोशिश नहीं करनी चाहिए। –

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