이전 문서에서는 delegate
키워드를 사용하여 특정 대리자 형식을 만드는 것을 알게 되었습니다.
추상 대리자 클래스는 느슨한 결합 및 호출을 위한 인프라를 제공합니다. 구체적인 대리자 형식은 대리자 개체의 호출 목록에 추가되는 메서드에 형식 안전성을 수용하고 적용하여 훨씬 더 유용합니다. 키워드를 delegate
사용하고 구체적인 대리자 형식을 정의하면 컴파일러가 이러한 메서드를 생성합니다.
실제로 다른 메서드 서명이 필요할 때마다 새 대리자 형식을 만들 수 있습니다. 이 작업은 시간이 지나면 지루해질 수 있습니다. 모든 새 기능에는 새 대리자 형식이 필요합니다.
고맙게도, 이것은 필요하지 않습니다. .NET Core 프레임워크에는 대리자 형식이 필요할 때마다 다시 사용할 수 있는 여러 형식이 포함되어 있습니다. 이것들은 새로운 메서드 선언이 필요할 때 사용자 지정을 선언할 수 있도록 하는 범용적인 정의입니다.
이러한 형식 Action 중 첫 번째는 형식이며 다음과 같은 몇 가지 변형이 있습니다.
public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.
in
제네릭 형식 인수의 한정자는 공변성 문서에서 다룹니다.
Action
대리자는 Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>처럼 최대 16개의 인수를 포함할 수 있는 변형들이 있습니다.
이러한 정의는 각 대리자 인수에 대해 서로 다른 제네릭 인수를 사용하는 것이 중요합니다. 이렇게 하면 유연성을 극대화할 수 있습니다. 메서드 인수는 동일한 형식일 필요는 없지만 같은 형식일 수 있습니다.
void 반환 형식의 대리자 형식에 대해 Action
형식 중 하나를 사용합니다.
프레임워크에는 값을 반환하는 대리자 형식에 사용할 수 있는 몇 가지 제네릭 대리자 형식도 포함되어 있습니다.
public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity
out
결과 제네릭 형식 인수의 한정자는 공변성 아티클에서 다룹니다.
최대 16개의 입력 인수를 가진 Func
대리자의 변형이 Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>과 같이 있습니다.
결과의 형식은 항상 규칙에 따라 모든 선언의 Func
마지막 형식 매개 변수입니다.
값을 반환하는 모든 대리자 형식에 대해 Func
형식 중 하나를 사용합니다.
또한 단일 값에 대한 테스트를 반환하는 대리자의 특수 형식 Predicate<T> 도 있습니다.
public delegate bool Predicate<in T>(T obj);
모든 Predicate
형식에 대해 구조적으로 동등한 Func
형식이 있음을 알 수 있습니다. 예를 들면 다음과 같습니다.
Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;
이러한 두 형식은 동일하다고 생각할 수 있습니다. 그들은 아닙니다. 이러한 두 변수는 서로 교환하여 사용할 수 없습니다. 한 형식의 변수는 다른 형식에 할당할 수 없습니다. C# 형식 시스템은 구조체가 아닌 정의된 형식의 이름을 사용합니다.
.NET Core 라이브러리의 이러한 모든 대리자 형식 정의는 대리자가 필요한 새 기능에 대해 새 대리자 형식을 정의할 필요가 없음을 의미합니다. 이러한 제네릭 정의는 대부분의 상황에서 필요한 모든 대리자 형식을 제공해야 합니다. 필요한 형식 매개 변수를 사용하여 이러한 형식 중 하나를 인스턴스화할 수 있습니다. 제네릭으로 만들 수 있는 알고리즘의 경우 이러한 대리자를 제네릭 형식으로 사용할 수 있습니다.
이렇게 하면 시간이 절약되고 대리자를 작업하기 위해 만들어야 하는 새 형식의 수가 최소화됩니다.
다음 문서에서는 대리자를 실제로 사용하기 위한 몇 가지 일반적인 패턴을 볼 수 있습니다.
.NET