c# - पूरी तरह से+= और-= ऑपरेटरों की व्याख्या कैसे की जा सकती है?




operators (3)

क्या वास्तव में (हुड के तहत) += और -= ऑपरेटर करते हैं?

या वे इसमें निहित हैं कि वे प्रति प्रकार परिभाषित हैं?

मैंने उन्हें बड़े पैमाने पर उपयोग किया है, यह सिंटैक्स की एक बहुत ही सरल विशेषता है, लेकिन मैंने कभी इस बारे में नहीं सोचा कि यह कैसे काम करता है।

प्रश्न के बारे में क्या लाया

मैं एक स्ट्रिंग मान को बदल सकता हूं जैसे:

var myString = "hello ";
myString += "world";

सब ठीक। लेकिन संग्रह के साथ यह काम क्यों नहीं करता है?

var myCol = new List<string>();
myCol += "hi";

आप कह सकते हैं 'अच्छी तरह से आप एक अलग प्रकार को जोड़ने का प्रयास कर रहे हैं, आप एक स्ट्रिंग को उस प्रकार से जोड़ नहीं सकते जो स्ट्रिंग नहीं है'। लेकिन निम्नलिखित काम नहीं करता है:

var myCol = new List<string>();
myCol += new List<string>() { "hi" };

ठीक है, शायद यह संग्रह के साथ काम नहीं करता है, लेकिन निम्नलिखित घटना हैंडलर का संग्रह नहीं है?

myButton.Click += myButton_Click;

मुझे स्पष्ट रूप से इन ऑपरेटरों के काम करने की गहन समझ की कमी है।

कृपया ध्यान दें: मैं इस तरह संग्रह myCol बनाने की कोशिश नहीं कर रहा हूँ, एक वास्तविक परियोजना में। मैं इस ऑपरेटर के कामकाज के बारे में केवल उत्सुक हूं, यह काल्पनिक है।


जैसा कि अन्य उत्तर में कहा गया है, + ऑपरेटर List<> लिए परिभाषित नहीं है List<> । आप इसे अतिभारित करने की कोशिश कर सकते हैं, संकलक इस त्रुटि को फेंक देगा One of the parameters of a binary operator must be the containing type

लेकिन एक प्रयोग के रूप में, आप अपने स्वयं के वर्ग की विरासत List<string> को परिभाषित कर सकते हैं और + ऑपरेटर को परिभाषित कर सकते हैं। कुछ इस तरह:

class StringList : List<string>
{
    public static StringList operator +(StringList lhs, StringList rhs)
    {
        lhs.AddRange(rhs.ToArray<string>());
        return lhs;
    }
}

तो आप समस्याओं के बिना यह कर सकते हैं:

StringList listString = new StringList() { "a", "b", "c" };
StringList listString2 = new StringList() { "d", "e", "f" };
listString += listString2;

संपादित करें

प्रति @EugeneRyabtsev टिप्पणी के अनुसार, + ऑपरेटर के मेरे कार्यान्वयन से अप्रत्याशित व्यवहार होगा। तो यह कुछ इस तरह होना चाहिए:

public static StringList operator +(StringList lhs, StringList rhs)
{
      StringList newList=new StringList();
      newList.AddRange(lhs.ToArray<string>());
      newList.AddRange(rhs.ToArray<string>());
      return newList;
}

संक्षिप्त उत्तर यह है कि C # में ऑपरेटरों को एक दिए गए प्रकार के लिए ओवरलोड किया जाना है। यह भी += लिए रखती है। string में इस ऑपरेटर का अधिभार शामिल है, लेकिन List<> नहीं है। इसलिए, सूचियों के लिए += ऑपरेटर का उपयोग करना संभव नहीं है। प्रतिनिधियों के लिए, += ऑपरेटर भी ओवरलोडेड है, यही वजह है कि आप इवेंट हैंडलर पर += उपयोग कर सकते हैं।

थोड़ा लंबा जवाब यह है कि आप ऑपरेटर को खुद को अधिभारित करने के लिए स्वतंत्र हैं। हालाँकि, आपको इसे अपने प्रकारों के लिए अधिभारित करना होगा, इसलिए List<T> लिए अधिभार बनाना संभव नहीं है, जबकि आप वास्तव में अपने वर्ग के लिए यह कर सकते हैं कि उदाहरण के लिए List<T> से विरासत में मिली।

तकनीकी रूप से, आप वास्तव में += -ऑपरेटर को अधिभार नहीं देते हैं, लेकिन + ऑपरेटर। += ऑपरेटर को असाइनमेंट के साथ + ऑपरेटर के संयोजन से अनुमान लगाया जाता है। इस काम के लिए, + ऑपरेटर को इस तरह से ओवरलोड किया जाना चाहिए कि परिणाम प्रकार पहले तर्क के प्रकार से मेल खाता है, अन्यथा जब आप उपयोग करने का प्रयास करते हैं तो C # -compiler एक त्रुटि संदेश फेंकने वाला है।


+= ऑपरेटर को इस तरह से परिभाषित किया जाता है: a += b a = a + b; में बदल जाता है a = a + b; , वही -= ऑपरेटर के साथ।
(चेतावनी: जैसा कि Jeppe ने कहा है, अगर a अभिव्यक्ति है, तो इसका मूल्यांकन केवल एक बार किया जाता है यदि आप a+=b उपयोग करते हैं, लेकिन दो बार a=a+b )

आप अलग से += और -= ऑपरेटर को ओवरलोड नहीं कर सकते। कोई भी प्रकार जो + ऑपरेटर का समर्थन करता है वह भी += का समर्थन करता है। आप ओवरलोडिंग + और - द्वारा अपने स्वयं के प्रकारों के लिए += और -= लिए समर्थन जोड़ सकते हैं।

हालाँकि c # में एक हार्ड कोड है, जिसे आपने खोज लिया है:
ईवेंट में एक += और -= ऑपरेटर होता है, जो एक ईवेंट हैंडलर को सब्सक्राइब्ड ईवेंट हैंडलर की सूची में जोड़ता है और हटाता है। इसके बावजूद, वे + और - ऑपरेटरों का समर्थन नहीं करते हैं।
यह कुछ ऐसा नहीं है जिसे आप नियमित ऑपरेटर ओवरलोडिंग के साथ अपनी कक्षाओं के लिए कर सकते हैं।







operators