저는 오랫동안 .NET 개발을 해왔고, 최근에 "C# Advanced Programming"이라는 책을 리뷰했습니다. 한때 이해한다고 생각했지만 이해하지 못했던 많은 문제들이 사실은 천천히 공부하고 이해할 수 있다는 것을 알게 되었습니다.
그래서 저는 "C# 고급 프로그래밍 시리즈"에 관한 블로그 글을 쓰기 시작할 계획입니다. 이 글은 "C# Advanced Programming" 책의 개념을 바탕으로 하며, 다른 전문가들의 블로그 글도 참고할 예정이니 이해해 주셨으면 합니다. 문제가 있으면 꼭 바로잡아 주세요.
(또한: 이 블로그 글에서는 정의와 문법의 기본을 설명하지 않습니다.) )
시운전에 대해 이야기해 봅시다.
Delegate는 .NET에서 널리 사용됩니다. 람다 표현식, 이벤트, 익명성 방법 등이 포함될 예정입니다(후속 블로그 글도 기대해 주세요).
그렇다면 위탁이란 무엇일까요?
쉽게 말해, 대의자는 메서드를 지정하는 것과 다르지 않지만, 대리자 키워드를 지정해야 하고 메서드 엔티티가 없다는 점이 다릅니다. 예를 들어, 무엇을 다룰지 모른 채 코드를 작성할 때 임시 표시자라고 생각할 수 있습니다. 도입할 매개변수 유형과 출력 유형을 알고 정의하기만 하면 됩니다. 책에서 전달하는 방식은 서명이 반드시 같은 의미여야 한다는 것입니다.
기본적인 위임을 정의해 봅시다:
실행 결과:
위에서 말한 실용적인 신뢰 장소를 보시나요? 즉,대리자는 동일한 인제스팅 매개변수 유형과 반환 유형을 가진 어떤 메서드도 실행할 수 있고, 심지어 동일한 서명을 가진 메서드 큐도 실행할 수 있습니다.
그렇다면 메서드 시그니처(즉, 가져오기와 출력 매개변수)가 정말로 대리자와 정확히 같아야 하나요? 답변: 아니요, 공분산과 역변이를 무시할 수 없습니다. 공변과 인버터에 대한 지식을 간단히 소개해 보겠습니다.
"공분산"이란 원래 지정된 파생 타입보다 더 파생된 타입을 사용할 수 있는 것을 의미합니다. "인버터"는 파생 정도가 적은 타입을 사용할 수 있는 능력을 의미합니다. 그리고 우리의 위탁도 공분산과 역함수의 영향을 받습니다.
즉, 위임자가 정의되면 동일한 서명 메서드만이 위임자 변수에 값을 할당할 수 있습니다.
메서드의 매개변수 테이블이 대리자 선언과 일치하지만 파생 클래스를 반환한다면(대의자 선언이 타입을 반환한다면), 이 메서드도 이 대리자 변수에 할당할 수 있다.
메서드의 반환 타입이 delegate의 선언과 일치하지만, 인자가 delegate 선언 매개변수 타입의 조상 클래스라면, 메서드는 delegate 변수에도 할당할 수 있습니다.
메서드의 매개변수와 반환 타입이 위 두 줄의 가정과 일치하면, 메서드는 위임자 변수에도 할당할 수 있습니다.
다음은 공변 vs. 인버터의 간단한 예시입니다:
공분산:
인버터:
|