मैं इसे एक अलग उत्तर में डाल रहा हूं क्योंकि आपका EDIT आपका प्रश्न वास्तव में अलग करता है।
मैं शायद बाद में इस उत्तर का विस्तार करूंगा क्योंकि मैं ग्राहक के पास आने के लिए जल्दी में हूं।
आपका संपादन इंगित करता है कि आपको मूल्य प्रकार, संदर्भ प्रकार और var, Out, const और कोई पैरामीटर चिह्नित करने के प्रभाव के बारे में पुनर्विचार करने की आवश्यकता है।
चलो मान प्रकार की चीज़ पहले करें।
मूल्य प्रकारों के मूल्य स्टैक पर रहते हैं और एक प्रति-कार्य-कार्य व्यवहार करते हैं। (मैं उस पर एक उदाहरण शामिल करने का प्रयास करूंगा)।
जब आपके पास कोई पैरामीटर अंकन नहीं होता है, तो विधि (प्रक्रिया या फ़ंक्शन) को पारित वास्तविक मान विधि के अंदर उस पैरामीटर के स्थानीय मान पर प्रतिलिपि बनाई जाएगी। तो विधि इसे पारित मूल्य पर काम नहीं करती है, लेकिन एक प्रतिलिपि पर।
जब आपके पास, var या const है, तो कोई प्रति नहीं होती है: विधि वास्तविक मान को पारित करेगी। Var के लिए, यह उस वास्तविक मान को बदलने की अनुमति देगा, क्योंकि यह उसमें अनुमति नहीं देगा। बाहर के लिए, आप वास्तविक मान को पढ़ने में सक्षम नहीं होंगे, लेकिन फिर भी वास्तविक मान लिखने में सक्षम होंगे।
संदर्भ प्रकारों के मान ढेर पर रहते हैं, इसलिए यदि आपके पास बाहर, var, const या कोई पैरामीटर अंकन नहीं है तो: यदि आप कुछ बदलते हैं, तो आप ढेर पर मान बदलते हैं।
संदर्भ प्रकारों के लिए, जब भी आपके पास पैरामीटर अंकन नहीं होता है तब भी आपको एक प्रति प्राप्त होती है, लेकिन यह उस संदर्भ की एक प्रति है जो अभी भी ढेर पर मान को इंगित करती है।
यह वह जगह है जहां अनाम विधियां जटिल होती हैं: वे एक चरणीय कैप्चर करते हैं। (बैरी शायद इसे और भी बेहतर समझा सकता है, लेकिन मैं इसे आज़मा दूंगा) आपके संपादित मामले में, अनाम विधि सूची की स्थानीय प्रतिलिपि को कैप्चर करेगा। अज्ञात विधि उस स्थानीय प्रतिलिपि पर काम करेगी, और एक कंपाइलर परिप्रेक्ष्य से सब कुछ बेवकूफ है।
हालांकि, आपके संपादन का क्रूक्स 'यह सामान्य मानकों के लिए काम करता है' का संयोजन है और 'जो गारंटी देता है कि जब भी अनाम विधि निष्पादित की जाती है तो संदर्भ जीवित वस्तु को इंगित कर रहा है'।
यह संदर्भ पैरामीटर के साथ हमेशा एक समस्या है, भले ही आप अज्ञात विधियों का उपयोग करें या नहीं।
उदाहरण इस के लिए:
procedure TMyClass.AddObject(Value: TObject);
begin
FValue := Value;
end;
procedure TMyClass.DoSomething();
begin
ShowMessage(FValue.ToString());
end;
कौन गारंटी देता है कि जब कोई DoSomething कहता है, कि उदाहरण जहां FValue अंक अभी भी मौजूद है के लिए? उत्तर यह है कि जब आप FValue की मृत्यु हो जाती है तो आपको DoSomething को कॉल करके स्वयं को गारंटी देनी चाहिए। आपके संपादन के लिए समान है: अंतर्निहित उदाहरण की मृत्यु होने पर आपको अनाम विधि को कॉल नहीं करना चाहिए।
यह उन क्षेत्रों में से एक है जहां संदर्भ गिना जाता है या कचरा एकत्रित समाधान जीवन को आसान बनाते हैं: वहां का उदाहरण जीवित रखा जाएगा जब तक कि इसका अंतिम संदर्भ समाप्त नहीं हो जाता है (जो आपके मूल रूप से अपेक्षाकृत अधिक समय तक जीवित रहने का कारण बन सकता है!)।
तो, आपके संपादन के साथ, आपका प्रश्न वास्तव में अज्ञात तरीकों से संदर्भ टाइप किए गए पैरामीटर और आजीवन प्रबंधन का उपयोग करने के प्रभावों में बदल जाता है।
उम्मीद है कि मेरा उत्तर आपको उस क्षेत्र में जाने में मदद करता है।
- जेरोइन
संदर्भित पैरामीटर के बजाय पॉइंटर का उपयोग करें। – MajidTaheri