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
'프로그래밍 > C#' 카테고리의 다른 글
Welcome to C# 9.0 - Init-only properties & record (0) | 2020.07.07 |
---|---|
C# 9.0이 공개되었습니다. (0) | 2020.05.21 |
[NDC] 이놈의 enum의 박싱을 어찌할꼬 (동영상링크) (0) | 2020.01.05 |
CLR via C# 23장 어셈블리 로딩과 리플렉션 (0) | 2019.12.09 |
CLR via C# 9장 매개변수 (2) | 2019.09.30 |