다음을 통해 공유


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

--= 연산자에는 기본 제공 정수부동 소수점 숫자 형식, 대리자 형식이 지원됩니다.

산술 - 연산자에 대한 자세한 내용은 산술 연산자 문서의 단항 더하기 및 빼기 연산자빼기 연산자 - 섹션을 참조하세요.

대리자 제거

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

  • 두 피연산자가 모두 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# 언어 사양

자세한 내용은 C# 언어 사양단항 빼기 연산자빼기 연산자 섹션을 참조하세요.

참고 항목