Operator Overloadable , dari MSDN:
Operator tugas tidak bisa kelebihan beban, tetapi +=
, misalnya, dievaluasi menggunakan +
, yang bisa dibebani.
Terlebih lagi, tidak ada operator penugasan yang dapat kelebihan beban. Saya pikir ini karena akan ada efek untuk pengumpulan Sampah dan manajemen memori, yang merupakan lubang keamanan potensial di dunia tipe CLR yang kuat.
Namun demikian, mari kita lihat apa sebenarnya operator itu. Menurut buku Jeffrey Richter yang terkenal , setiap bahasa pemrograman memiliki daftar operatornya sendiri, yang disusun dalam metode panggilan khusus, dan CLR sendiri tidak tahu apa-apa tentang operator. Jadi mari kita lihat apa sebenarnya yang tertinggal di belakang operator +
dan +=
.
Lihat kode sederhana ini:
Decimal d = 10M;
d = d + 10M;
Console.WriteLine(d);
Mari lihat kode IL untuk instruksi ini:
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
Sekarang mari kita lihat kode ini:
Decimal d1 = 10M;
d1 += 10M;
Console.WriteLine(d1);
Dan kode IL untuk ini:
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
Mereka sama! Jadi +=
operator hanyalah gula sintaksis untuk program Anda di C # , dan Anda cukup membebani +
operator.
Sebagai contoh:
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;
}
Kode ini akan dikompilasi dan berhasil dijalankan sebagai:
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
Memperbarui:
Menurut Pembaruan Anda - seperti yang dikatakan @EricLippert, Anda benar-benar harus memiliki vektor sebagai objek yang tidak dapat diubah. Hasil penjumlahan kedua vektor tersebut adalah vektor baru , bukan vektor pertama dengan ukuran berbeda.
Jika, karena alasan tertentu Anda perlu mengubah vektor pertama, Anda dapat menggunakan kelebihan ini (tetapi bagi saya, ini adalah perilaku yang sangat aneh):
public static Vector operator +(Vector left, Vector right)
{
left.x += right.x;
left.y += right.y;
return left;
}