MSDN से अधिभार संचालक :
असाइनमेंट ऑपरेटरों को ओवरलोड नहीं किया जा सकता है, लेकिन +=
, उदाहरण के लिए, का उपयोग करके मूल्यांकन किया जाता है +
, जिसे ओवरलोड किया जा सकता है।
इससे भी अधिक, असाइनमेंट ऑपरेटरों में से कोई भी ओवरलोड नहीं हो सकता है। मुझे लगता है कि यह इसलिए है क्योंकि कचरा संग्रह और मेमोरी प्रबंधन के लिए एक प्रभाव होगा, जो सीएलआर मजबूत टाइप की दुनिया में एक संभावित सुरक्षा छेद है।
फिर भी, आइए देखें कि वास्तव में एक ऑपरेटर क्या है। प्रसिद्ध जेफरी रिक्टर की पुस्तक के अनुसार , प्रत्येक प्रोग्रामिंग भाषा की अपनी ऑपरेटरों की सूची होती है, जिन्हें एक विशेष विधि कॉल में संकलित किया जाता है, और सीएलआर स्वयं ऑपरेटरों के बारे में कुछ भी नहीं जानता है। तो आइए देखते हैं कि ऑपरेटरों +
और +=
ऑपरेटरों के पीछे क्या रहता है ।
देखें यह सरल कोड:
Decimal d = 10M;
d = d + 10M;
Console.WriteLine(d);
आइए इस निर्देश के लिए IL-code देखें:
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: newobj instance void [mscorlib]System.Decimal::.ctor(int32)
IL_0008: stloc.0
IL_0009: ldloc.0
IL_000a: ldc.i4.s 10
IL_000c: newobj instance void [mscorlib]System.Decimal::.ctor(int32)
IL_0011: call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Addition(valuetype [mscorlib]System.Decimal,
valuetype [mscorlib]System.Decimal)
IL_0016: stloc.0
अब इस कोड को देखते हैं:
Decimal d1 = 10M;
d1 += 10M;
Console.WriteLine(d1);
और इसके लिए IL-code:
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: newobj instance void [mscorlib]System.Decimal::.ctor(int32)
IL_0008: stloc.0
IL_0009: ldloc.0
IL_000a: ldc.i4.s 10
IL_000c: newobj instance void [mscorlib]System.Decimal::.ctor(int32)
IL_0011: call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Addition(valuetype [mscorlib]System.Decimal,
valuetype [mscorlib]System.Decimal)
IL_0016: stloc.0
वे बराबर हैं! तो +=
ऑपरेटर C # में आपके प्रोग्राम के लिए सिंटैक्टिक शुगर है , और आप बस +
ऑपरेटर को अधिभारित कर सकते हैं ।
उदाहरण के लिए:
class Foo
{
private int c1;
public Foo(int c11)
{
c1 = c11;
}
public static Foo operator +(Foo c1, Foo x)
{
return new Foo(c1.c1 + x.c1);
}
}
static void Main(string[] args)
{
Foo d1 = new Foo (10);
Foo d2 = new Foo(11);
d2 += d1;
}
इस कोड को संकलित किया जाएगा और सफलतापूर्वक इस रूप में चलाया जाएगा:
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: newobj instance void ConsoleApplication2.Program/Foo::.ctor(int32)
IL_0008: stloc.0
IL_0009: ldc.i4.s 11
IL_000b: newobj instance void ConsoleApplication2.Program/Foo::.ctor(int32)
IL_0010: stloc.1
IL_0011: ldloc.1
IL_0012: ldloc.0
IL_0013: call class ConsoleApplication2.Program/Foo ConsoleApplication2.Program/Foo::op_Addition(class ConsoleApplication2.Program/Foo,
class ConsoleApplication2.Program/Foo)
IL_0018: stloc.1
अपडेट करें:
आपके अपडेट के अनुसार - जैसा कि @EricLippert कहता है, आपके पास वास्तव में एक अपरिवर्तनीय वस्तु के रूप में वैक्टर होना चाहिए। दो वैक्टरों को जोड़ने का परिणाम एक नया वेक्टर है, न कि विभिन्न आकारों वाला पहला।
यदि, किसी कारण से आपको पहले वेक्टर को बदलने की आवश्यकता है, तो आप इस अधिभार का उपयोग कर सकते हैं (लेकिन मेरे लिए, यह बहुत ही अजीब व्यवहार है):
public static Vector operator +(Vector left, Vector right)
{
left.x += right.x;
left.y += right.y;
return left;
}