2008-09-16 20 views
13

क्या किसी के पास सी # विधि के अंदर this असाइनमेंट का उपयोगी उदाहरण है? नौकरी साक्षात्कार के दौरान मुझे इसके लिए एक बार पूछा गया है, और मुझे अभी भी जवाब देने में दिलचस्पी है।सी # में "यह" असाइनमेंट का उदाहरण क्या है?

उत्तर

42

अन्य उत्तर सही नहीं हैं, जब वे कहते हैं कि तुम 'इस' को नहीं सौंप सकते। यह सच है, तो आप एक वर्ग प्रकार के लिए नहीं है, लेकिन आप एक struct प्रकार के लिए कर सकते हैं कर सकते हैं:

public struct MyValueType 
{ 
    public int Id; 
    public void Swap(ref MyValueType other) 
    { 
     MyValueType temp = this; 
     this = other; 
     other = temp; 
    } 
} 

किसी भी बिंदु पर एक struct की तरह ही तो 'इस' को बताए द्वारा बदल सकते हैं।

+7

हर दिन कुछ नया सीखें ... –

+1

ओह, ऐसा इसलिए है क्योंकि एक संरचना के रूप में यह एक मूल्य प्रकार और असाइनमेंट ऑपरेटर = मूल्य प्रकार प्रतियों के मानों के साथ है। –

+0

प्रबुद्ध!विषयपरक टिप्पणी: हालांकि स्वैप (रेफ स्ट्रक्चर) परिदृश्य के अलावा, मैं किसी और चीज के बारे में सोच नहीं सकता जो इससे लाभ उठा सकता है। इसका उपयोग उस संरचना के सभी सदस्यों को निर्दिष्ट करने से पहले नहीं किया जा सकता है। मैं इसके बजाय उपरोक्त के रूप में उपयोग की जाने वाली विधि रखने के बजाय s2 = s1 का उपयोग करना चाहता हूं। – Gishu

-1

आप "यह" ओवरराइट नहीं कर सकते हैं। यह वर्तमान ऑब्जेक्ट उदाहरण को इंगित करता है।

+0

मूल्य प्रकारों के लिए सही नहीं है। – jnm2

-1

सिंटैक्स बिंदु दृश्य से इसके लिए केवल सही जगह है, तो जब आप foo (ftype this, ...) के रूप में विधि के पहले पैरामीटर निर्दिष्ट करते हैं तो एक्सटेंशन विधियां सी # 3.0 में होती हैं। और फिर ftype के किसी भी उदाहरण के लिए इस एक्सटेंशन का उपयोग कर सकते हैं। लेकिन यह सिर्फ वाक्यविन्यास है और इस ओवरवेड ऑपरेशन को वास्तविक नहीं है।

+0

सच नहीं है। मान प्रकार ''' को असाइन कर सकते हैं और इसके लिए कोई अन्य वाक्यविन्यास नहीं है। – jnm2

0

का उपयोग करके यह कीवर्ड यह सुनिश्चित करता है कि वर्तमान प्रकार में स्कॉप्ड केवल चर और विधियां एक्सेस की जाएंगी। इसका उपयोग तब किया जा सकता है जब आपके पास फ़ील्ड/प्रॉपर्टी और स्थानीय चर या विधि पैरामीटर के बीच नामकरण संघर्ष हो।

आमतौर कंस्ट्रक्टर्स में इस्तेमाल किया:

private readonly IProvider provider; 
public MyClass(IProvider provider) 
{ 
    this.provider = provider; 
} 

इस उदाहरण में हम निजी क्षेत्र प्रदाता के लिए पैरामीटर प्रदाता निर्दिष्ट करते हैं।

+0

'इस' को असाइन करने का उदाहरण नहीं है। – jnm2

-1

यदि आपको पर पर कुछ असाइन करने के लिए कहा जाता है, तो कुछ उदाहरण हैं।

class frmMain 
{ 
    void InitializeComponents() 
    { 
     btnOK = new Button(); 
     btnOK.Parent = this; 
    } 
} 
+0

'इस' को असाइन करने का उदाहरण नहीं है। – jnm2

-1

"इस" वर्तमान वर्ग उदाहरण के लिए एक संदर्भ है: एक यह है कि मन में आता है एक नियंत्रण है जो अपने पिता है कह रहा है। आप एक वर्ग पर एक गैर स्थैतिक विधि है, तो आप इस का उपयोग करते हुए वर्तमान वर्ग उदाहरण का उल्लेख कर सकते हैं:

public class MyClass{ 

     public string SomeProperty {get;set;} 
     public void GetSomeProperty(){ 
     return this.SomeProperty; 
     } 

} 
+0

'इस' को असाइन करने का उदाहरण नहीं है। – jnm2

-1

मुझे पता है कि इस प्रश्न का उत्तर दिया गया है और चर्चा बंद हो गई है, लेकिन यहां एक मामला है जिसे मैंने इंटरवेब्स पर कहीं भी नहीं देखा और सोचा कि यह यहां साझा करने के लिए उपयोगी हो सकता है।

मैंने अभी भी serialization का समर्थन करते हुए सदस्यों की अपरिवर्तनीयता बनाए रखने के लिए इसका उपयोग किया है। एक struct इस तरह परिभाषित किया गया पर विचार करें:

public struct SampleStruct : IXmlSerializable 
{ 
    private readonly int _data; 

    public int Data { get { return _data; } } 

    public SampleStruct(int data) 
    { 
     _data = data; 
    } 

    #region IXmlSerializableMembers 

    public XmlSchema GetSchema() { return null; } 

    public void ReadXml(XmlReader reader) 
    { 
     this = new SampleStruct(int.Parse(reader.ReadString())); 
    } 

    public void WriteXml(XmlWriter writer 
    { 
     writer.WriteString(data.ToString()); 
    } 

    #endregion 
} 

हम this अधिलेखित करने की अनुमति हो बाद से, हम एक उदाहरण के भीतर आयोजित _data की अचल बनाए रख सकते हैं। इसमें नए मूल्यों को deserializing जब आप एक ताजा उदाहरण की गारंटी दी जाती है, इसका अतिरिक्त लाभ है, जो कभी-कभी एक अच्छी गारंटी है! }

+0

आपने अभी एक म्यूटेबल वैल्यू टाइप बनाया है। और इससे भी बदतर, आप एक परिवर्तनीय मान प्रकार बनाते हैं जो * प्रकट होता है * जैसे कि यह पहली नज़र में अपरिवर्तनीय है। यह सभी प्रकार की बुराई है। – Servy

+0

मैं थोड़ी अधिक सुरक्षा के लिए IXmlSerializable इंटरफ़ेस को स्पष्ट रूप से कार्यान्वित करने की अनुशंसा करता हूं, लेकिन फिर प्रश्न बन जाता है, क्या सीरियलज़ेबल होने के लिए यह हमेशा ठीक है, क्योंकि धारावाहिक होने के लिए आपको किसी अर्थ में उत्परिवर्तनीय होने की आवश्यकता है। – mhand

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