वे अधिक सीमित हैं। आप पॉइंटर पर ++ कह सकते हैं, लेकिन ref
या out
पर नहीं।
संपादित टिप्पणी में कुछ भ्रम की स्थिति है, तो बिल्कुल स्पष्ट होना करने के लिए: यहां मुद्दा यह संकेत की क्षमताओं के साथ तुलना करने के लिए है। आप ptr++
पर ref
/out
पर एक ही ऑपरेशन नहीं कर सकते हैं, यानी इसे स्मृति में आसन्न स्थान को संबोधित करते हैं। यह सच है (लेकिन यहां अप्रासंगिक) कि आप (*ptr)++
के समतुल्य प्रदर्शन कर सकते हैं, लेकिन यह मान की क्षमताओं के साथ इसकी तुलना करना होगा, पॉइंटर्स नहीं।
यह एक सुरक्षित शर्त है कि वे आंतरिक रूप से सिर्फ संकेत दिए गए हैं, क्योंकि ढेर ले जाया नहीं प्राप्त करता है और सी # ध्यान से आयोजित किया जाता है ताकि ref
और out
हमेशा ढेर के एक सक्रिय क्षेत्र के सन्दर्भ में है।
संपादित फिर से पूरी तरह से स्पष्ट है (यदि वह पहले नीचे दिए गए उदाहरण से स्पष्ट नहीं था), यहां मुद्दा यह है कि ref
/out
कर सकते हैं केवल ढेर इंगित नहीं है। यह है जब यह स्टैक को इंगित करता है, यह भाषा नियमों द्वारा गारंटीकृत पॉइंटर बनने की गारंटी नहीं है। यह गारंटी आवश्यक है (और यहां प्रासंगिक/रोचक) क्योंकि स्टैक केवल विधि कॉल निकास के अनुसार जानकारी को त्याग देता है, यह सुनिश्चित करने के लिए कि कोई भी रेफरर अभी भी मौजूद है, कोई जांच नहीं है।
इसके विपरीत जब ref
/out
जीसी ढेर में वस्तुओं को संदर्भित करता है यह कोई आश्चर्य की बात है कि उन वस्तुओं जब तक आवश्यक के रूप में जीवित रखा जा करने में सक्षम हैं: जीसी ढेर समय के किसी भी लम्बाई के लिए बनाए रखने की वस्तुओं के प्रयोजन के लिए ठीक डिज़ाइन किया गया है उनके संदर्भकर्ताओं द्वारा आवश्यक, और परिस्थितियों का समर्थन करने के लिए पिनिंग (नीचे उदाहरण देखें) प्रदान करता है जहां ऑब्जेक्ट को जीसी कॉम्पैक्टिंग द्वारा स्थानांतरित नहीं किया जाना चाहिए।
क्या तुमने कभी असुरक्षित कोड में इंटरॉप के साथ खेलते हैं, तो आप पाएंगे कि ref
बहुत बारीकी से संकेत से संबंधित है।उदाहरण के लिए, एक COM इंटरफेस इस तरह घोषित किया जाता है, तो:
HRESULT Write(BYTE *pBuffer, UINT size);
इंटरॉप विधानसभा इस में बदल जाएगा:
void Write(ref byte pBuffer, uint size);
और आप इस कॉल करने के लिए (मेरा मानना है कि COM इंटरॉप सामान कर सकते हैं सरणी) pinning का ख्याल रखता है: पहली बाइट आप इसे के सभी के लिए पहुँच हो जाता है करने के लिए
byte[] b = new byte[1000];
obj.Write(ref b[0], b.Length);
दूसरे शब्दों में, ref
; यह स्पष्ट रूप से पहले बाइट के लिए एक सूचक है।
आप 'रेफरी' तर्क पर '++' ठीक कर सकते हैं, लेकिन इसका मतलब यह नहीं है। –
इसके अलावा, "' ref' और 'out' हमेशा स्टैक के सक्रिय क्षेत्र को संदर्भित करता है" बस पूरी तरह से गलत है। आपका स्वयं का उदाहरण जीसी ढेर पर किसी ऑब्जेक्ट में 'रेफरी' बनाता है। –