এমএসডিএন থেকে ওভারলোডযোগ্য অপারেটরগুলি :
অ্যাসাইনমেন্ট অপারেটরগুলি ওভারলোড করা যায় না, তবে +=
উদাহরণস্বরূপ, ব্যবহার করে মূল্যায়ন করা হয় +
, যা ওভারলোড করা যায়।
আরও বেশি, অ্যাসাইনমেন্ট অপারেটরগুলির কেউই ওভারলোড করা যাবে না। আমি মনে করি কারণ এটি আবর্জনা সংগ্রহ এবং মেমরির পরিচালনার জন্য প্রভাব ফেলবে যা সিএলআর শক্তিশালী টাইপড ওয়ার্ল্ডের একটি সম্ভাব্য সুরক্ষা গর্ত।
তবুও, আসুন দেখা যাক ঠিক একজন অপারেটর কী। বিখ্যাত জেফরি রিখটারের বই অনুসারে , প্রতিটি প্রোগ্রামিং ভাষার নিজস্ব অপারেটর তালিকা থাকে, যা একটি বিশেষ পদ্ধতি কলগুলিতে সংকলিত হয়, এবং সিএলআর নিজেও অপারেটরদের সম্পর্কে কিছুই জানে না। সুতরাং এর দেখতে ঠিক পিছনে থাকে কি দিন +
এবং +=
অপারেটর।
এই সাধারণ কোডটি দেখুন:
Decimal d = 10M;
d = d + 10M;
Console.WriteLine(d);
এই নির্দেশাবলীর জন্য আইএল-কোডটি দেখতে দিন:
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_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
তারা সমান! সুতরাং +=
অপারেটর সি # তে আপনার প্রোগ্রামের জন্য কেবল সিনট্যাকটিক চিনি এবং আপনি কেবল +
অপারেটরকে ওভারলোড করতে পারেন ।
উদাহরণ স্বরূপ:
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
হালনাগাদ:
আপনার আপডেট অনুসারে - @ এরিকলিপার্ট যেমন বলেছে, সত্যিই আপনার অপরিবর্তনীয় বস্তু হিসাবে ভেক্টর থাকা উচিত। দুটি ভেক্টর যুক্ত করার ফলাফল একটি নতুন ভেক্টর, বিভিন্ন আকারের প্রথমটি নয়।
যদি কোনও কারণে আপনাকে প্রথমে ভেক্টর পরিবর্তন করতে হয় তবে আপনি এই ওভারলোডটি ব্যবহার করতে পারেন (তবে আমার কাছে এটি খুব আশ্চর্যজনক আচরণ):
public static Vector operator +(Vector left, Vector right)
{
left.x += right.x;
left.y += right.y;
return left;
}