2011-10-26 10 views
12

मान लीजिए कि मेरे पास 2 कक्षाएं, फू और बार हैं। फू के पास बार के संबंध नहीं हैं (और नहीं हो सकते हैं)।सी #: ऑब्जेक्ट्स के बीच मजबूत संदर्भ बनाएं, बिना किसी संदर्भ के अन्य

हालांकि, मैं एक बार उदाहरण जीवित रहने के लिए चाहता हूं, जब तक कि यह foo उदाहरण जीवित रहता है। क्या ऐसा करने का कोई तरीका है, फू वास्तव में बार संदर्भित किए बिना?

धन्यवाद, कोएन

+2

जब आप कचरा कलेक्टर काम करने के तरीके को बदलने की कोशिश कर रहे हैं, तो आपको शायद अपने डिजाइन पर एक अच्छा नज़र डालना चाहिए और देखें कि इसे भाषा में काम में बदला जा सकता है या नहीं। उस ने कहा: दिलचस्प सवाल! =) – Jens

+0

तुच्छ समाधान को अस्वीकार कर अपने लिए जीवन क्यों कठिन बनाते हैं? –

+0

@ डेविड हेफरनन लगता है कि उनके पास कुछ प्रकार के निर्भरता मुद्दे हैं जो उन्हें ऐसा करने से रोकते हैं। – Steve

उत्तर

16

ConditionalWeakTable Class पर एक नज़र डालें।

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

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

उदाहरण के लिए, यदि आप एक

ConditionalWeakTable<Foo, Bar> table 

को परिभाषित करने और एक फू/बार जोड़ी जोड़ सकते हैं। बार उदाहरण को तब तक जीवित रखा जाता है जब तक कि Foo इंस्टेंस का संदर्भ मौजूद न हो। आप टेबल को देखकर फू इंस्टेंस के लिए बार इंस्टेंस पा सकते हैं।

+0

बिल्कुल सही जादू, एक आकर्षण की तरह काम करता है, धन्यवाद! – KoenJ

0

यह जानने के बिना कि आप क्या हासिल करने की कोशिश कर रहे हैं, या "जीवित" से आपका क्या मतलब है, बिना सुझाव देना मुश्किल है। आम तौर पर आपको प्रबंधित वस्तुओं के जीवनकाल के बारे में चिंता करने की आवश्यकता नहीं होती है: जब वे अब संदर्भित नहीं होते हैं तो वे स्वाभाविक रूप से "मर जाते हैं"।

लेकिन जो कुछ आप चाहते हैं उसे करने के लिए, या तो Foo उदाहरण Bar उदाहरण का संदर्भ लेना चाहिए, या किसी अन्य ऑब्जेक्ट को लिंक बनाने के लिए दोनों को संदर्भित करना चाहिए। यह Bar उदाहरण System.Object के रूप में संदर्भ का संदर्भ हो सकता है, यानी Foo को Bar प्रकार के बारे में जानने की आवश्यकता नहीं है।

0

बार को केवल अंतिम रूप दिया जा सकता है अगर कुछ इसका संदर्भ है। बस फू को उस चीज़ को बताएं जब यह बार जाने दे।

+0

"फू के पास बार के साथ संबंध नहीं है (और नहीं हो सकता है" .. –

0

क्या आप सार्वजनिक ऑब्जेक्ट फ़ील्ड बना सकते हैं जिसे बारू में बाररेंसेंस कहा जाता है?
फू के बाहर किसी को इस संपत्ति में बार का उचित उदाहरण निर्धारित करना चाहिए।
जब तक बार उदाहरण के संदर्भ में यह GCed नहीं होगा और ऑब्जेक्ट का उपयोग करके Foo बार प्रकार के बारे में कुछ भी नहीं जानता है।

+0

"फू के पास बार के संबंध नहीं हैं (और नहीं हो सकते हैं)" –

+0

** टाइप ** Foo ** प्रकार से संबंधित नहीं है ** बार यदि आप ऑब्जेक्ट का उपयोग करते हैं तो मैं सुझाव देता हूं। यदि कोई _semantic_ संबंध नहीं होना चाहिए तो यह एक और मामला है। – ViktorZ

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