의뢰 컨셉저자 : Liang Binyu "C# 초급교실"에서 발췌 곧 출간 예정
초급교실@163.com
http://www.cnblogs.com/BeginnerClassroom
때때로 우리는 함수를 다른 함수의 매개변수로 사용해야 하고, 그런 다음 위임 메커니즘을 사용해야 합니다. 위임은 명확하게 설명하기 어려운 개념이다. 저자는 며칠 동안 고민한 끝에 기발한 예를 생각해냈다.
다음으로 서커스 공연 함수 RunCircus()를 설계합니다. 첫 번째 매개변수는 동물을 나타내는 함수입니다. 어떤 동물이 전달되더라도 해당 동물의 공연이 수행됩니다. "Delegate"라는 새 프로젝트를 생성하고 다음 코드를 추가하세요.
시도해 보세요: 위임자 정의
//"C# 초급강의실"
//기능: 개 쇼
static void DogAct(문자열 이름)
{
Console.WriteLine("안녕하세요. 저는 " + 이름 + "!");
Console.WriteLine(@"
------.
__.'__ `.
.--(#)(##)---/#
.' @ /###
: , #####
`-..__.-' _.-###/
`;_: `''
.''''''''`.
/,스누피,
// 시원한! \
`-._______.-'
___`.'___ |
(______|______)");
}
//기능: 고양이 쇼
static void CatAct(문자열 이름)
{
Console.WriteLine("안녕하세요. 저는 " + 이름 + "!");
Console.WriteLine(@"
.-. __ _ .-.
| ` / |
/ '.()--
|'._/
_|오 _오 |_
= '-' /=
'-._____.-'
/`/___/`
//오오/
(_| |_)
|____,____|
(____|____)");
}
//기능: 사자 쇼
static void LionAct(문자열 이름)
{
Console.WriteLine("안녕하세요. 저는 " + 이름 + "!");
Console.WriteLine(@"
,%%%%%%%%,
,%%/%%%%/%%
,%%%c "" J/%%%
%. %%%%/ o o %%%
`%%.%%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( / `%%%%%%%'
\ .' |
\ / |
\/ ) |
/_ |__
(____________)))))))");
}
//델리게이트 정의
대리자 void AnimalAct(문자열 이름);
//기능: 서커스 공연(첫 번째 매개변수는 AnimalAct 유형 대리자)
static void RunCircus(AnimalAct 동물법, 문자열 이름)
{
동물법(이름);
}
정적 무효 Main(string[] args)
{
//DogAct() 함수를 AnimalAct 유형 대리자로 변환합니다.
AnimalAct deleDogAct = new AnimalAct(DogAct);
//대리자 deleDogAct를 RunCircus() 함수에 전달합니다.
RunCircus(deleDogAct, "스누피");
//CatAct() 함수를 AnimalAct 유형 대리자로 변환하고 RunCircus() 함수에 전달합니다.
RunCircus(new AnimalAct(CatAct), " 고양이 ");
}
실행 결과는 다음과 같습니다.
"C# 초급반"
RunCircus(AnimalAct 동물법, 문자열 이름) 함수의 첫 번째 매개변수는 실제로 동물을 나타내는 함수입니다. 어떤 종류의 함수가 전달되는지는 어떤 종류의 동물을 수행하는지에 따라 결정됩니다. 하지만 엄격한 유형 검사를 수행하려면 함수 이름을 직접 전달할 수 없으며 먼저 위임자(Dlelegate), 즉 "함수 유형"을 정의해야 합니다.
위의 문은 대리자의 매개 변수 유형과 반환 값 유형을 명확하게 지정하는 AnimalAct라는 대리자(함수 유형)를 정의합니다. 함수를 매개변수로 사용해야 하는 경우 먼저 이를 대리자 인스턴스로 변환해야 합니다.
그런 다음 이 대리자 인스턴스는 이를 호출하는 함수에 매개 변수로 전달됩니다.
대리자 인스턴스 deleDogAct는 실제로 DogAct() 함수의 별칭임을 알 수 있습니다. 대리자와 위임된 함수는 동일한 매개 변수 형식과 반환 형식을 가져야 합니다.
우리 프로그램에서 서커스는 항상 RunCircus() 함수를 호출하여 수행합니다. RunCircus() 함수를 정의할 때 전달된 대리자가 어떤 함수를 나타내는지 알거나 신경 쓰지 않습니다. 이 함수는 RunCircus() 함수가 호출되고 실제 매개 변수가 전달될 때까지 구체화되지 않습니다. 실제 매개변수가 무엇이든 전달되면 공연이 수행됩니다. deleDogAct 위임을 전달하면 서커스는 개 공연을 수행합니다. deleCatAct 위임을 전달하면 서커스는 고양이 공연을 수행합니다. deleLionAct 대표단이 서커스단에서 고양이 공연을 선보였습니다. 따라서 대리자를 매개 변수로 사용하는 함수에는 특정 일반성이 있습니다.