MSDN의 Overloadable Operators :
할당 연산자는 오버로드 할 수 없지만 +=
예를 들어는 +
오버로드 될 수있는를 사용하여 평가됩니다 .
더욱이 할당 연산자는 오버로드 될 수 없습니다. CLR의 강력한 유형 세계에서 잠재적 인 보안 허점 인 가비지 수집 및 메모리 관리에 영향을 미칠 것이기 때문이라고 생각합니다.
그럼에도 불구하고 연산자가 정확히 무엇인지 봅시다. 유명한 Jeffrey Richter의 저서에 따르면 각 프로그래밍 언어에는 고유 한 연산자 목록이 있으며 특수 메서드 호출로 컴파일되며 CLR 자체는 연산자에 대해 아무것도 모릅니다. 이제 +
및 +=
연산자 뒤에 정확히 무엇이 있는지 살펴 보겠습니다 .
이 간단한 코드를 참조하십시오.
Decimal d = 10M;
d = d + 10M;
Console.WriteLine(d);
이 지침에 대한 IL 코드를 보겠습니다.
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 코드 :
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;
}