본문 바로가기

프로그래밍/C#

Rider의 Delegate subtractions warning

public sealed class SomeViewClass
{
    public void BindEvent()
    {
    	GetModel()?.UpdateEvent += OnModelUpdated;
    }
    
    public void ReleaseEvent()
    {
    	GetModel()?.UpdateEvent -= OnModelUpdated;
    }
}

 위와 같이 코드를 짜면 ReleaseEvent 부분에서 Rider의 경고가 뜬다.

 Delegate subtraction을 주의하라는 경고인데, 이게 왜 주의해야할 대상인지 몰라 Rider 도큐먼트를 찾아보았다.

 

 찾아본 결과 당연히 저런식으로 사용하는 것 자체는 문제가 없고, Rider에서 경고하고 싶었던 것은 delegate subtraction에서 발생할 수 있는 미묘한 문제들이었다.

 

static void Main()
{
    Action a = () => Console.Write("A");
    Action b = () => Console.Write("B");
    Action c = () => Console.Write("C");
    Action s = a + b + c + Console.WriteLine;
    s();                  //ABC
    (s - a)();            //BC
    (s - b)();            //AC
    (s - c)();            //AB
    (s - (a + b))();      //C
    (s - (b + c))();      //A
    (s - (a + c))();      //ABC
}

 예시에서 주목해야할 것은 마지막 라인인데, 다른 경우 우리가 의도했던 대로 잘 동작하지만 이 경우는 그렇지 않다. 왜냐면 delegate (a+c)는 S의 sublist로 인식되지 않기 때문이다.

 

s = a + b + a;
(s - a)();            // AB

 요건 또 다른 예시인데, s에서 a를 빼버리면 s에 있는 모든 a를 제거한다고 얼핏 생각할 수 있겠지만 그렇지 않다. 중복되어있는 경우는 이벤트 객체의 delegate list를 뒤져 직접 비교, 제거를 해주어야 할 것이다.

 

reference : https://www.jetbrains.com/help/rider/DelegateSubtraction.html