컴포저블한 대리자 | pcmichaels

오. 대리자를 결합할 수 있다는 것을 여지껏 몰랐네요.

var aAction = () => Console.WriteLine("A");
var bAction = () => Console.WriteLine("B");
var cAction = aAction + bAction;

cAction();

var aFunc = () => 1;
var bFunc = () => 2;
var cFunc = aFunc + bFunc;

var result = cFunc();
Console.WriteLine(result);

https://www.pmichaels.net/2022/04/04/composable-delegates/?utm_source=rss&utm_medium=rss&utm_campaign=composable-delegates

좋아요 7

유용한 팁이군요!
헌데 얼핏 잘못보면 헷갈릴 것 같다는 느낌도 들었습니다.

뭔가 기존 제가 알던 방법은 샌드위치에 치즈 한 장씩 넣는 기분이라면,
이건 햄이랑 치즈랑 같이 뭉친채로 넣는 기분이네요 -0-…ㅎㅎㅎㅎㅎ

좋아요 2

오 신기하네요…저도 이런게 있는지 몰랐는데 출력해보니 하나씩 실행되는 느낌이네요.

좋아요 1

이게 사실 내부적으로는 이벤트 등록 방식과 유사하게 (또는 동일하게) 동작할 것 같아요.

그래도… 이렇게 쓰일 수 있다는 것 자체를 전혀 몰랐다는게 개인적으로는 매우 놀랐습니다.

좋아요 3

네. 요거 내부적으로는 += 효과를 내는 거랑 동일하게 동작해요. ~ㅁ~
정확히는 Delegate.Combine() 이 호출 돼서 + 로 연결된 델리게이트를 하나로 묶어 체인으로 만들지요.

근데 은근 이 문법이 기존의 연산자 오버로딩하는 거랑 헷갈려서 저는 그다지 자주 쓰지는 않숨다…

특히 올려주신 예제 두번째 델리게이트 체이닝은
얼핏 보면 3이 나와야 할 거 같은 느낌이 들잖애요… ;ㅁ;

저런 거 실수할 가능성 때문에 저는 좀 무섭…

좋아요 6

참고로 C# 언어 초창기부터 이런 스펙을 가지고 있었기 때문에, 모양은 안 예쁠지언정 함수형 언어들처럼 함수 커링 (Function Currying) 컨셉을 제공하고, 그 덕에 F#에서도 비슷한 operation을 취할 수 있습니다.

그리고 이벤트의 경우, 잘 쓰이진 않지만 프로퍼티처럼 선언하면서 이벤트 액세서를 커스터마이징하는 것도 가능합니다.

좋아요 4