2011-07-22 12 views

उत्तर

3

ज्यादातर मामलों में, आपको विधियों में self का उपयोग नहीं करना चाहिए।

type 
    TMyClass = class 
    public 
    Value: string; 
    procedure MyMethod; 
    procedure AddToList(List: TStrings); 
    end; 


procedure TMyClass.MyMethod; 
begin 
    Value := 'abc'; 
    assert(self.Value='abc'); // same as assert(Value=10) 
end; 

self जब आप वर्तमान निर्दिष्ट करना चाहते हैं इस्तेमाल किया जा रहा है:

वास्तव में, यह जब तुम वर्ग गुण और विधियों का उपयोग, एक वर्ग विधि के भीतर की तरह अगर वहाँ एक अंतर्निहित self. उपसर्ग थी किसी अन्य विधि या वस्तु पर ऑब्जेक्ट करें।

उदाहरण के लिए:

procedure TMyClass.AddToList(List: TStrings); 
var i: integer; 
begin 
    List.AddObject(Value,self); 
    // check that the List[] only was populated via this method and this object 
    for i := 0 to List.Count-1 do 
    begin 
    assert(List[i]=Value); 
    assert(List.Objects[i]=self); 
    end; 
end; 

इस उपरोक्त कोड List.Objects [] TMyClass उदाहरण की ओर इशारा करते के साथ TStrings सूची में एक आइटम जोड़ देगा। और यह जांच करेगा कि यह सूची के सभी वस्तुओं के लिए मामला है।

+0

@AB - "निहित आत्म" - चूंकि मैंने पाइथन के साथ गड़बड़ करना शुरू कर दिया है, जिसके लिए किसी भी आंतरिक वर्ग के सदस्य का संदर्भ देते समय 'स्वयं' की आवश्यकता होती है, मैंने इसे डेल्फी में भी करना शुरू कर दिया है - मुझे यकीन नहीं है कि मुझे यह पसंद है या स्टाइलिस्टिक रूप से नहीं, लेकिन ऐसा लगता है कि कोड की त्वरित स्कैनिंग की सुविधा है। – Vector

+0

@ माइकी डेल्फी में सामान्य अभ्यास 'self.' उपसर्ग का उपयोग नहीं करना है। वास्तव में, आईडीई इंटेलिजेंस आपको संपत्ति नामों तक त्वरित रूप से पहुंचने की अनुमति देता है, या माउस पॉप-अप संकेत या Ctrl + क्लिक के साथ घोषणा को देखता है - इसलिए इस उपसर्ग को निर्दिष्ट करने की कोई आवश्यकता नहीं है।यदि आप अपने कोड में वैश्विक चर परिभाषित नहीं करते हैं (यह अच्छे कोड के लिए आवश्यक है), तो आप जानते हैं कि आपके विधियों कोड में पहचानकर्ता संपत्ति/विधि नाम हैं। इसलिए, आपको अपने तरीकों में 'self.' उपसर्ग का उपयोग नहीं करना चाहिए (जब तक' कथन 'के अंदर नहीं)। –

+0

@AB - मैं आपके द्वारा बताए गए सभी लोगों से जानता हूं और सहमत हूं लेकिन यह इसका उपयोग करने के मेरे कारण को अस्वीकार नहीं करता है। यदि आप कोड के एक टुकड़े को स्कैन/स्पीड करना चाहते हैं, तो 'स्वयं' मदद करता है - अक्सर मैं वापस बैठना चाहता हूं और बिना किसी माउस या इंटरैक्शन के कोड पढ़ता हूं, और मैं अभी भी कोड प्रिंट करना चाहता हूं और इसे पढ़ना चाहता हूं। तो यह "स्वयं सहायता" दृष्टिकोण है .... एलओएल – Vector

9

डेल्फी में स्वयं इसके बराबर है। यह here में वर्णित अनुसार असाइन करने योग्य भी है।

+3

ध्यान दें कि, चूंकि यह मूल्य से गुजरता है, इसलिए स्वयं को असाइन करना बहुत उपयोगी नहीं है, हालांकि यह किया जा सकता है। ऐसा नहीं होगा, जैसा कि कुछ उम्मीद कर सकते हैं, एक कन्स्ट्रक्टर से "वापसी" शून्य (रचनाकार वास्तव में कुछ भी "वापस नहीं" करते हैं - असाइनमेंट सिंटैक्स सिर्फ एक सुविधा है)। –

+1

हमम ... मैं देखता हूं कि आपके द्वारा जुड़े एसओ प्रश्न में लोग वही कहते हैं। –

+0

स्वयं को सौंपना एक कोने का मामला है और आम तौर पर आपको ऐसा करने की आवश्यकता नहीं होती है क्योंकि इसे खराब अभ्यास के रूप में माना जा सकता है। फिर भी, एक वर्ग के संदर्भ के रूप में स्वयं का उपयोग केवल तभी उपयोगी होता है जब कोई गैर मानक नामकरण सम्मेलनों का उपयोग कर रहा हो। मानक सम्मेलन एफ का उपयोग कक्षा चर के उपसर्ग (उदाहरण के रूप में FIs सही) और ए प्रक्रिया/कार्य तर्क (एआईएस सुधार) के रूप में होगा। फिर, कक्षा चर के असाइनमेंट जितना आसान होगा FISCorrect: = AIs सही, वैकल्पिक रूप से आपको स्वयं का उपयोग करने की आवश्यकता होगी। गलत: = अगर सही है (प्रक्रिया) तर्क है: गलत है: बूलियन। – too

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