मैं एक वर्ग की तलाश कर रहा था ताकि एक ही कक्षा के थ्रेड-सुरक्षित और असुरक्षित संस्करण दोनों प्रदान किए जा सकें। इसके तकनीकी पहलू बहुत स्पष्ट हैं। मैं नामकरण/पहुँच सम्मेलनों आदि को खोजने के लिए उम्मीद कर रही थी लगता है ...इस नेट का लाभ क्या है
तो मैं 'Systems.Collections' नाम स्थान में हर जगह इस पैटर्न को खोजने:
public class WhatEv
{
private class SyncWhatEv : WhatEv
{
// overrides IsSyncronized = true
// overrides whatever else to make it thread safe
}
public virtual bool IsSynchronized
{
get { return false; }
}
public static WhatEv Synchronized(WhatEv whatEv)
{
return new SyncWhatEv(whatEv);
}
}
वर्गों है कि यह लागू की एक संख्या हैं: हैशटेबल, कतार, ऐरेलिस्ट, ढेर, आदि ... मैं विरासत को समझता हूं। लेकिन इसे एक निजी, नेस्टेड क्लास क्यों बनाते हैं और उपयोगकर्ता इसे प्राप्त करने के लिए एक उछाल से कूदते हैं? क्या इस तरह से ऐसा करने के लिए कोई फायदा है?
अभी तक आपके इनपुट के लिए धन्यवाद। मैं बस एक परिदृश्य की कल्पना करने की कोशिश कर रहा हूं जहां इसका उपयोगकर्ता मूल वर्ग को बिना थ्रेड-सुरक्षित जानने के प्राप्त करना चाहता है। यदि रिसीवर एक धागा है, तो इसे थ्रेड-सुरक्षित संस्करण की आवश्यकता होनी चाहिए, है ना? अगर रिसीवर नहीं है, तो इसकी परवाह क्यों होगी? – TBone
यदि आप इसे दो धागे से एक्सेस कर रहे हैं, तो दोनों को एक ही सिंक्रनाइज़ किए गए इंस्टेंस का उपयोग करने की आवश्यकता है। आप रिसीवर को सिंक्रनाइज़ किए गए इंस्टेंस का उपयोग नहीं कर सकते हैं, और मुख्य धागा गैर-सिंक किए गए संस्करण का उपयोग करता है। तो यदि किसी अन्य धागे द्वारा ऑब्जेक्ट का उपयोग करने का कोई मौका है, तो इसे सिंक्रनाइज़ किया जाना चाहिए। लेकिन एक संभावित समस्या के लिए जोएल का जवाब देखें। – CodeNaked
@ नग्न - सहमत। लेकिन SyncWhatEv व्हाट्सएव विरासत में आता है। तो SyncWhatEv का एक ही उदाहरण मुख्य थ्रेड पर व्हाटएव टाइप के रूप में उपयोग किया जा सकता है और वर्क थ्रेड द्वारा सिंकवैटईवी प्रकार के रूप में आवश्यक है। केवल, यह संभव नहीं है क्योंकि SyncWhatEv निजी है। वर्तमान में थ्रेड को IsSynchronized को दोबारा जांचना होगा और गलत होने पर फेंकना होगा। – TBone