2009-05-09 16 views
22

संभव डुप्लिकेट:
When do you use the “this” keyword?सी # का उपयोग कब करें "यह" कीवर्ड

हैलो, मैं समझता हूँ कि This कीवर्ड वर्ग का एक उदाहरण के लिए किया जाता है लेकिन, , मान लीजिए कि मेरे पास Life नामक एक वर्ग है, जो दो फ़ील्ड को परिभाषित करता है, व्यक्ति (उनका नाम) और उनके साथी (उनका नाम) :

class Life 
{ 
    //Fields 
    private string _person; 
    private string _partner; 

    //Properties 
    public string Person 
    { 
     get { return _person; } 
     set { _person = value; } 
    } 

    public string Partner 
    { 
     get { return _partner; } 
     set { _partner = value; } 
    } 

    //Constructor 1 
    public Life() 
    { 
     _person = "Dave"; 
     _partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 

    //Constructor 2 
    public Life() 
    { 
     this._person = "Dave"; 
     this._partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 

क्या कन्स्ट्रक्टर 1 और कन्स्ट्रक्टर 2 के बीच कोई अंतर है ?? या यह "यह" कीवर्ड का उपयोग करने के लिए बस बेहतर कोडिंग अभ्यास है?

सादर

+0

Dup: http : //stackoverflow.com/questions/23250/when-do-you-use-the-this-keyword –

+0

डुप: http://stackoverflow.com/questions/479322/what-is-the-proper-use-of -कर्स-इन-इन-प्राइवेट-क्लास-सदस्य –

+1

@ मार्कर: यह एक डुबकी नहीं है, यह एक यात्रा है ... एक तिहाई! : पी – Cerebrus

उत्तर

22

कंस्ट्रक्टर्स ही हैं। कारण मैं दूसरा पसंद करूंगा कि यह आपको अपने निजी चर नामों से अंडरस्कोर को हटाने और संदर्भ को बनाए रखने (समझ में सुधार) को बनाए रखने की अनुमति देगा। उदाहरण चर और गुणों का जिक्र करते समय मैं हमेशा this का उपयोग करने का अभ्यास करता हूं।

अब मैं विभिन्न मानकों के साथ एक अलग कंपनी में जाने के बाद this कीवर्ड का उपयोग नहीं करता हूं। मैं इसका उपयोग कर चुका हूं और अब उदाहरण के सदस्यों का जिक्र करते समय शायद ही कभी इसका इस्तेमाल करता हूं। मैं अभी भी गुणों का उपयोग करने की सिफारिश करता हूं (जाहिर है)।

अपने वर्ग की मेरी संस्करण:

class Life 
{ 
    //Fields 
    private string person; 
    private string partner; 

    //Properties 
    public string Person 
    { 
     get { return this.person; } 
     set { this.person = value; } 
    } 

    public string Partner 
    { 
     get { return this.partner; } 
     set { this.partner = value; } 
    } 


    public Life() 
    { 
     this.person = "Dave"; 
     this.partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 

या और भी बेहतर है, लेकिन क्षेत्र के साथ this के उपयोग के बारे में स्पष्ट नहीं है।

class Life 
{ 

    //Properties 
    public string Person { get; set; } 
    public string Partner { get; set; } 

    public Life() 
    { 
     this.Person = "Dave"; 
     this.Partner = "Sarah"; 

     MessageBox.Show("Life Constructor Called"); 
    } 
} 
+0

तो क्या कोड मैंने ऐसा करने का एक पुराना तरीका पोस्ट किया है? और क्या वह कोड है जिसे आपने यह करने का अधिक अद्यतन तरीका पोस्ट किया है? भी ..... चूंकि आप केवल गुण घोषित करते हैं और फ़ील्ड नहीं, फ़ील्ड के लिए संशोधक स्तर कैसे सेट किया जाता है? या यह स्वचालित रूप से निजी रूप से सेट है? – Goober

+4

अंतिम उदाहरण सी # 3.0 (वीएस -2008) में पेश की गई स्वचालित गुणों का उपयोग करता है। सी # प्रोग्रामिंग गाइड से उद्धरण: "सी # 3.0 और बाद में, ऑटो-कार्यान्वित गुण संपत्ति-घोषणा को अधिक संक्षेप में बनाते हैं जब संपत्ति एक्सेसर्स में कोई अतिरिक्त तर्क की आवश्यकता नहीं होती है। वे ऑब्जेक्ट बनाने के लिए क्लाइंट कोड भी सक्षम करते हैं जब आप दिखाए गए गुण की घोषणा करते हैं निम्नलिखित उदाहरण में, कंपाइलर एक निजी, अज्ञात बैकिंग फ़ील्ड बनाता है केवल संपत्ति के माध्यम से एक्सेस किया जा सकता है और एक्सेसर्स सेट कर सकता है। " उदाहरण छोड़ा गया। – tvanfosson

+0

मुझे 'इस' कीवर्ड का उपयोग करना लगता है जब वर्बोज़ के लिए अनावश्यक तरीका और कोड को पढ़ने के लिए कठिन बनाता है। यह स्पष्ट होना चाहिए कि क्षेत्र क्या हैं और स्थानीय क्या हैं। यदि नहीं, तो आपको सामान तोड़ने की ज़रूरत है ताकि आपके पास छोटी विधियां हों। – vidstige

3
+0

+1 डुप्लिकेट को इंगित करने के लिए +1 जब कोई और इसे नहीं ढूंढ सके! मुझे आश्चर्य हुआ कि यह सवाल पहले ही बंद नहीं हुआ था! – Cerebrus

0

आप इस का उपयोग कर सकते हैं एक स्थानीय चर नामित एक्स और एक वर्ग के स्तर क्षेत्र/एक ही नाम के संपत्ति के बीच अंतर करने।

6

वहाँ दो बयानों में कोई अंतर नहीं है ...

//These are exactly the same. 

this._person 

//and 

_person 

संदर्भ "इस" _person के मामले में निहित है करने के लिए। मैं यह नहीं कहूंगा कि यह आवश्यक है "बेहतर" कोडिंग अभ्यास, मैं कहूंगा कि यह सिर्फ वरीयता है।

+1

बिंदु पर सहमत हुए: वरीयता –

+0

यूप। वाक्यविन्यास के साथ कुछ भी गलत नहीं है। – BlackWasp

+1

मैं अंडरस्कोर सिंटैक्स पसंद करता हूं क्योंकि यह छोटा है और ब्रायन ने कहा, अंडरस्कोर का मतलब है "यह" वैसे भी। एकमात्र लाभ मैं कहूंगा कि "इस" के स्पष्ट उपयोगकर्ता के लिए यह है कि अगर कोई अस्पष्टता मुद्दा है, तो "यह" इसे हल करेगा। उन मामलों में मैं एक विशेष मामले के रूप में इस मुद्दे को हल करने के लिए "इस" का उपयोग करता हूं। –

0

आपको निजी चर _person और _parter का उपयोग नहीं करना चाहिए। यह आपके गेटर्स और सेटर्स का उद्देश्य है।

जहां तक ​​संरचनाएं हैं, उनके बीच कोई वास्तविक अंतर नहीं है। ऐसा कहा जा रहा है, मैं हमेशा इस कीवर्ड का उपयोग करना पसंद करता हूं क्योंकि यह पठनीयता की ओर उधार देता है।

3

चूंकि आप अंडरस्कोर का उपयोग कर रहे हैं, नामों के बीच कोई संघर्ष नहीं है; इसलिए "this." अनावश्यक है और छोड़ा जा सकता है। आईएल अप्रभावित होगा।

जब तक एक क्षेत्र और परिवर्तनीय/पैरारेटर के बीच कोई अस्पष्टता नहीं है, तब तक केवल एक परिदृश्य है जिसमें this कीवर्ड (वर्तमान उदाहरण के संदर्भ में - सीटीओआर-चेनिंग नहीं) सख्ती से जरूरी है - एक का आह्वान करना विस्तार विधि है कि अलग से परिभाषित किया गया है:

this.SomeExtensionMethod(); // works 
SomeExtensionMethod(); // fails 
+0

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

12

"इस" भी नेट 3.5 में विस्तार के तरीकों के साथ प्रयोग किया जाता है:

public static class MyExtensions 
{  
    public static string Extend(this string text) 
    { 
     return text + " world"; 
    } 
} 

स्ट्रिंग वर्ग का विस्तार होगा

var text = "Hello"; 
text.Extend(); 

अपने प्रश्न का उत्तर देने के लिए: नहीं, आपके दो रचनाकारों में कोई अंतर नहीं है। इमो, "यह" कोड को अव्यवस्थित करता है और केवल आवश्यक होने पर ही इसका उपयोग किया जाना चाहिए, उदा। जब पैरामीटर और फ़ील्ड चर के समान नाम होते हैं।

एक ऐसा मामला भी है जब कक्षा स्पष्ट रूप से एक इंटरफ़ेस लागू करती है। आप इंटरफ़ेस को यह कास्ट करने के लिए होता है कि आप अपने वर्ग के भीतर से इंटरफ़ेस तरीकों कॉल करने के लिए की जरूरत है:

class Impl : IFace 
{ 

    public void DoStuff() 
    { 
     ((IFace)this).SomeMethod(); 
    } 

    void IFace.SomeMethod() 
    { 
    } 
} 
+0

पुन "तुमने मुझे इसे हराया"; वास्तव में, हम 2 अलग-अलग चीजें दिखा रहे हैं। मैं "इस" का उपयोग दिखा रहा हूं जब ** ** एक एक्सटेंशन विधि को कॉल करना - एक को परिभाषित करते समय नहीं।यह एक जिज्ञासा है कि इस तरह के मामलों में "यह" आवश्यक है। –

+0

+1 सहमत हैं कि "यह" कोड और अनावश्यक अव्यवस्थित है। – Vadim

1

दोनों कंस्ट्रक्टर्स दूसरा एक में वैसे भी एक ही बात करते हैं this अनावश्यक है

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