मुझे लगता है कि आप सोच रहे हैं कि Cache
ऑब्जेक्ट की कितनी प्रतियां बनाई जाएंगी। आप केवल एक कॉपी को कई क्लाइंट ऑब्जेक्ट्स द्वारा साझा करना चाहते हैं। खैर, एक बहुत ही सरल नियम है जिसे आप सी # में याद कर सकते हैं, जब भी आप जानना चाहते हैं कि आपकी ऑब्जेक्ट की कितनी अलग प्रतियां बनाई जाएंगी। साथ new
कीवर्ड:
वस्तु के प्रकार साथ घोषित किया जाता है तो class
कीवर्ड, तो केवल एक यह का एक नया उदाहरण बनाने के लिए रास्ता है।
इसमें मामूली अपवाद हैं: आप ऑब्जेक्ट बनाने वाले बीसीएल विधियों को कॉल कर सकते हैं, लेकिन बिंदु यह है कि यह स्पष्ट है। आपको विशेष रूप से ऐसा होने के लिए कहा जाना चाहिए। भाषा स्वचालित रूप से class
ऑब्जेक्ट्स की प्रतियां नहीं बनायेगी।
तो अपने उदाहरण में, आप एक class
Cache
कहा जाता है, और इसलिए आप कुछ के लिए पता है कि तुम चारों ओर प्रकार Cache
के रूप में ज्यादा आप की तरह के रूप में, और Cache
के आगे कोई प्रतियां बनाया जाएगा की चर पारित कर सकते हैं। उन सभी चरों जिनमें उन ऑब्जेक्ट को असाइन किया गया है, वही मूल ऑब्जेक्ट पर "पॉइंटिंग" होंगे। ऐसा इसलिए है क्योंकि Cache
वैरिएबल ऑब्जेक्ट को स्वयं संग्रहित नहीं करता है, लेकिन स्मृति में Cache
ऑब्जेक्ट का केवल स्थान है।
यदि आप class
के बजाय struct
प्रकार घोषित करते हैं तो इसके साथ क्या करें। अब जब आप उस प्रकार के चर को घोषित करते हैं, तो परिवर्तनीय को struct
में घोषित सभी डेटा को स्टोर करने के लिए पर्याप्त होना चाहिए। प्रत्येक चर एक अलग प्रति है। प्रत्येक पैरामीटर एक अलग प्रति है।
आप ref
कीवर्ड जोड़ कर इसे ओवरराइड कर सकते हैं, लेकिन यह अधिकांश कार्यक्रमों में एक बहुत ही असामान्य कीवर्ड है। out
कीवर्ड अधिक आम है, और एक से अधिक रिटर्न मूल्य विधि देने के तरीके के रूप में सबसे अच्छा विचार किया जाता है।
ref
पर कोई प्रभाव नहीं है यदि यह class
प्रकार है? अपने उदाहरण में:
public ObjectLoader(Cache cache) {
// do stuff with cache (store it?)
}
मैं इस तरह दो वस्तु लोडर का निर्माण कर सकते हैं:
Cache c = new Cache();
ObjectLoader a = new ObjectLoader(c),
ObjectLoader b = new ObjectLoader(c);
हम सिर्फ कितने वस्तुओं बनाया? बस new
कीवर्ड गिनें। अब, मान लीजिए हम ref
कीवर्ड कहा:
public ObjectLoader(ref Cache cache) {
_cache = cache; // store
// do something very odd!
cache = new Cache();
}
छिपा है कि निर्माता के अंदर, मैं एक और कैश बना लिया है, और पैरामीटर मैं पारित किया गया था में इसे संग्रहीत। चूंकि यह ref
पैरामीटर है, इसलिए मैंने कॉलर के चर को प्रभावित किया है! बुला कोड में तो: संशोधित ObjectLoader
निर्माता करने के लिए दो कॉल तीन से ऊपर स्निपेट में, प्लस:
Cache c = new Cache();
ObjectLoader a = new ObjectLoader(ref c),
ObjectLoader b = new ObjectLoader(ref c);
अब हम new
के पांच इस्तेमाल होता है। प्रत्येक बार ObjectLoader
के निर्माता को बुलाया जाता है, हम इसे c
पास करते हैं। हमें ref
कीवर्ड रखना है, जो एक बहुत अच्छी बात है क्योंकि इससे कोड पढ़ने वाले व्यक्ति को पता चलता है कि कुछ अजीब चल रहा है।परिवर्तनीय c
ObjectLoader
के कन्स्ट्रक्टर रिटर्न के बाद एक अलग Cache
पर इंगित करता है। तो b
का ObjectLoader
एक पॉइंटर को एक अलग Cache
से a
पर संग्रहीत करता है!
कहने की जरूरत नहीं है, यह कोड के लिए काफी गन्दा पैटर्न होगा। अगर हमें कॉलिंग साइट पर ref
कीवर्ड डालना नहीं था तो यह और भी बदतर होगा!
यह सामान्य सी/सी ++ पॉइंटर्स के साथ इतना आसान है :) – Eugene
मैं असहमत हूं :) लेकिन सी/सी ++ लोगों के लिए यह * (या &) और ** :) – Stormenet
नाइटपिक के बीच का अंतर है: दूसरा उदाहरण - आप हैं एक स्थिर संपत्ति का उपयोग। – Cherian