다음을 통해 공유


- 및 -= 연산자 - 빼기(뺄셈)

기본 제공 정수부동 소수점 숫자 형식과 대리자 형식은 모두 --= 연산자를 지원합니다.

산술 - 연산자에 대한 정보는 산술 연산자 문서의 단항 플러스 및 마이너스 연산자빼기 연산자 - 섹션을 참조하세요.

대리자 제거

동일한 delegate 형식의 피연산자에 대해서 - 연산자는 다음과 같이 계산된 대리자 인스턴스를 반환합니다.

  • 두 피연산자 모두 null이 아니고 오른쪽 피연산자의 호출 목록이 왼쪽 피연산자 호출 목록의 적절한 연속 하위 목록인 경우 작업의 결과는 왼쪽 피연산자의 호출 목록에서 오른쪽 피연산자의 항목을 제거하여 얻은 새 호출 목록입니다. 오른쪽 피연산자의 목록이 왼쪽 피연산자 목록의 여러 연속 하위 목록과 일치하면 가장 일치하는 하위 목록만 제거됩니다. 제거로 인해 빈 목록이 생성되면 결과는 .입니다 null.

    Action a = () => Console.Write("a");
    Action b = () => Console.Write("b");
    
    var abbaab = a + b + b + a + a + b;
    abbaab();  // output: abbaab
    Console.WriteLine();
    
    var ab = a + b;
    var abba = abbaab - ab;
    abba();  // output: abba
    Console.WriteLine();
    
    var nihil = abbaab - abbaab;
    Console.WriteLine(nihil is null);  // output: True
    
  • 오른쪽 피연산자의 호출 목록이 왼쪽 피연산자 호출 목록의 적절한 연속 하위 목록이 아닌 경우 작업의 결과는 왼쪽 피연산자입니다. 예를 들어 멀티캐스트 대리자의 일부가 아닌 대리자를 제거해도 아무 작업도 수행되지 않으며 변경되지 않은 멀티캐스트 대리자가 생성됩니다.

    Action a = () => Console.Write("a");
    Action b = () => Console.Write("b");
    
    var abbaab = a + b + b + a + a + b;
    var aba = a + b + a;
    
    var first = abbaab - aba;
    first();  // output: abbaab
    Console.WriteLine();
    Console.WriteLine(object.ReferenceEquals(abbaab, first));  // output: True
    
    Action a2 = () => Console.Write("a");
    var changed = aba - a;
    changed();  // output: ab
    Console.WriteLine();
    var unchanged = aba - a2;
    unchanged();  // output: aba
    Console.WriteLine();
    Console.WriteLine(object.ReferenceEquals(aba, unchanged));  // output: True
    

    앞의 예제에서는 대리자 제거 중에 대리자 인스턴스를 비교하는 방법을 보여 줍니다. 예를 들어 동일한 람다 식 의 계산에서 생성된 대리자는 같지 않습니다. 대리자 같음에 대한 자세한 내용은 C# 언어 사양대리자 같음 연산자 섹션을 참조하세요.

  • 왼쪽 피연산자인 null경우 작업의 결과는 다음과 입니다 null. 오른쪽 피연산자인 null경우 작업의 결과는 왼쪽 피연산자입니다.

    Action a = () => Console.Write("a");
    
    var nothing = null - a;
    Console.WriteLine(nothing is null);  // output: True
    
    var first = a - null;
    a();  // output: a
    Console.WriteLine();
    Console.WriteLine(object.ReferenceEquals(first, a));  // output: True
    

대리자를 결합하려면 연산자를+ 사용합니다.

대리자 형식에 대한 자세한 내용은 대리자참조하세요.

빼기 할당 연산자 -=

-= 연산자를 사용하는 식(예:

x -= y

에 해당합니다.

x = x - y

단, x 한 번만 평가됩니다.

다음 예제에서는 -= 연산자의 사용을 보여 줍니다.

int i = 5;
i -= 9;
Console.WriteLine(i);
// Output: -4

Action a = () => Console.Write("a");
Action b = () => Console.Write("b");
var printer = a + b + a;
printer();  // output: aba

Console.WriteLine();
printer -= a;
printer();  // output: ab

또한 연산자를 -= 사용하여 이벤트에서 구독을 취소할 때 제거할 이벤트 처리기 메서드를 지정합니다. 자세한 내용은 이벤트구독 및 구독 취소하는 방법을 참조하세요.

연산자 오버로드 가능성

사용자 정의 형식은 연산자를 오버로드할 - 수 있습니다. 이진 - 연산자가 오버로드되면 -= 연산자도 암시적으로 오버로드됩니다. C# 14부터 사용자 정의 형식은 보다 효율적인 구현을 제공하기 위해 연산자를 명시적으로 오버로드 -= 할 수 있습니다. 일반적으로 형식은 빼기 결과를 저장하기 위해 새 인스턴스를 할당하는 대신 값을 현재 위치에서 업데이트할 수 있기 때문에 연산자를 오버로드 -= 합니다. 형식이 명시적 오버로드를 제공하지 않으면 컴파일러는 암시적 오버로드를 생성합니다.

C# 언어 사양

자세한 내용은 C# 언어 사양단항 빼기 연산자 및 빼기 연산자 섹션을 참조하세요. C# 14 이상에서 복합 할당 연산자를 오버로드하는 방법에 대한 자세한 내용은 사용자 정의 복합 할당 기능 사양을 참조하세요.

참고하십시오