2010-10-02 12 views
10

डेल्फी में, अगर मैं एक साधारण वर्ग myClass है और मैं myFunction(myClass) के साथ एक समारोह है, जो function myFunction(myObject : myClass) : Boolean द्वारा परिभाषित किया गया है करने के लिए इसे का एक उदाहरण पारित ...डेल्फी: संदर्भ द्वारा पास या मूल्य से पास?

  • myObject की एक प्रतिलिपि बनाई जा सकता है?

  • जब मैं myFunction में myObject के तरीकों को कॉल करता हूं, तो क्या मूल वस्तु प्रभावित और संशोधित होगी?

उत्तर

22

ऑब्जेक्ट संदर्भ द्वारा पारित किए जाते हैं। एक प्रति नहीं बनाई जाएगी; कक्षा का केवल एक उदाहरण होगा, केवल एक वस्तु होगी। मूल वस्तु सब कुछ है।

+1

अरे तुम मुझे यह करने के लिए हरा ... :) +1 –

+5

हाँ, मूल वस्तु ढेर पर है। लेकिन जब तक आप संदर्भ से गुजरते हैं, तब तक आपको संदर्भ की ** प्रति ** प्राप्त होती है। उस स्थिति में आपको किसी ऑब्जेक्ट के संदर्भ का संदर्भ मिलता है। –

+1

[केवल एक ही हो सकता है] (http://www.imdb.com/title/tt0091203/) –

4

वस्तुओं को संदर्भ द्वारा पारित किया जाता है।

+0

मैंने तुम्हें हराया! :) - –

7

"ऑब्जेक्ट संदर्भ द्वारा पारित किए गए" की तुलना में इसके लिए थोड़ा और कुछ है। ऑब्जेक्ट संदर्भ प्रकार हैं, और इसलिए वे हमेशा डिफ़ॉल्ट रूप से संदर्भ के आधार पर पारित होते हैं। कोई वस्तु चर एक वस्तु संदर्भ है।

लेकिन अगर आप एक वस्तु चर "संदर्भ द्वारा," (एक वर पैरामीटर, करने के लिए) पास फिर अगर आप नियमित आप के लिए इसे पारित अंदर एक अलग वस्तु के साथ वस्तु की जगह है, तो आप एक साथ समाप्त कर देंगे एक बार नियमित वापसी के बाद अलग वस्तु। ऐसा करने पर सावधान रहें; यदि आप एक निश्चित वस्तु को केवल एक निश्चित वस्तु में बदलते हैं तो यह स्मृति रिसाव का कारण बन सकता है।

+2

जब आप कहते हैं कि "ऑब्जेक्ट को किसी भिन्न ऑब्जेक्ट से प्रतिस्थापित करें," तो आप वास्तव में "ऑब्जेक्ट * संदर्भ * को * एक अलग ऑब्जेक्ट * के संदर्भ में प्रतिस्थापित करें।" आप ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट से प्रतिस्थापित नहीं कर सकते हैं, लेकिन आप जो भी चाहते हैं उसे संदर्भित कर सकते हैं। –

+0

और @Rob, आप दोनों इस अर्थ में सही हैं कि "ऑब्जेक्ट" को कॉल करने में ऐसा प्रचलित गलत नामक है जो 'टॉब्जेक्ट' का संदर्भ है ... 'MyForm.Width' की वास्तविक चौड़ाई है फॉर्म जिसका संदर्भ 'माईफॉर्म' चर द्वारा किया जाता है। आप 'MyForm' चर बदलते हैं और' MyForm.Width' एक अन्य फ़ॉर्म की चौड़ाई है। तो, "आप एक अलग वस्तु के साथ खत्म हो जाएगा" अभ्यास में प्रोग्रामर की वास्तविकता कुछ हद तक वर्णन करता है। –

13

डेल्फी में, वस्तुएं विशेष पॉइंटर्स हैं जो ढेर स्मृति पर डेटा संरचना का संदर्भ देती हैं। जब आप किसी ऑब्जेक्ट को किसी फ़ंक्शन पर पास करते हैं, तो आप वास्तव में पॉइंटर पास कर रहे हैं, न कि पूरे ऑब्जेक्ट डेटा की एक प्रति। इस मामले में, जब आप उस संदर्भ के माध्यम से किसी फ़ील्ड या प्रॉपर्टी को संशोधित करते हैं, तो यह मूल ऑब्जेक्ट डेटा को प्रभावित करेगा।

program ObjParamTest; 

type 
    TMyClass = class 
    private 
    FMyField : Integer; 
    public 
    property MyField : Integer read FMyField write FMyField; 
    end; 


function ModifyObject(AnObj: TMyClass); 
begin 
    AnObj.MyField := AnObj.MyField + 1; 
end; 

var 
    MyObj : TMyClass; 
begin 
    MyObj := TMyClass.Create; 
    try 
    AnObj.MyField := 2; 
    Writeln(AnObj.MyField); // ==> Prints 2 
    ModifyObject(MyObj); 
    Writeln(AnObj.MyField); // ==> Prints 3 
    finally 
    MyObj.Free; 
    end; 
end. 

भी ध्यान रखने, पैरामीटर संशोधक (जैसे वार, कॉन्स्ट, आउट) एक ही रास्ता वस्तु संदर्भ कार्य करने के लिए पारित कर दिया है बदलने के लिए, और मूल पर कोई प्रभाव नहीं ले: यहाँ एक सरल उदाहरण इस व्यवहार का प्रदर्शन किया जाता है डेटा संरचना।

हो सकता है कि यह लेख आपके लिए डेल्फी में कार्यों के लिए पैरामीटर प्रदान करने के विभिन्न तरीकों के बारे में चीजों को साफ करता है और अधिक:

Different function parameter modifiers in Delphi (संग्रहीत संस्करण)

+3

ग्रेट लिंक्ड आलेख! – Mick

+1

मैं मिक से सहमत हूं कि आपका लेख पढ़ने योग्य है।फिर भी, मुझे लगता है कि आपकी पोस्ट को भेजने से पहले यहां प्रश्न का संक्षिप्त, सीधा जवाब पोस्ट करना सबसे फायदेमंद होगा। विशेष रूप से क्योंकि यह किसी वस्तु को मूल्य या var द्वारा पारित करने के बीच अंतर को विस्तार से संबोधित नहीं करता है। –

+0

धन्यवाद, मैंने एक संक्षिप्त विवरण और पोस्ट के लिए एक साधारण उदाहरण जोड़ा। – vcldeveloper

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