C\#의 의뢰 delegate 용법 의 예시 상세 설명

C\#의 의뢰
의뢰 와 사건 은.NET Framework 에서 매우 광범 위 하 게 응용 되 지만 의뢰 와 사건 을 잘 이해 하 는 것 은 C\#시간 이 길지 않 은 많은 사람들 에 게 쉽 지 않다.그들 은 마치 하나의 난간 과 같다.이 난간 을 넘 은 사람 은 정말 쉽다 고 생각 하지만,과거 가 없 는 사람 은 의뢰 와 사건 을 볼 때마다 마음 이 답답 하고 온몸 이 불편 하 다.이 장 에서 저 는 의뢰 가 무엇 인지,왜 의뢰 를 사용 해 야 하 는 지,사건 의 유래,.NET Framework 의 의뢰 와 사건,의뢰 중의 방법 이상 과 시간 초과 처리,의뢰 와 비동기 프로 그래 밍,의뢰 와 사건 이 Observer 디자인 모델 에 대한 의 미 를 간단명료 하 게 이야기 하고 그들의 컴 파일 코드 에 대해 서도 토론 할 것 입 니 다.
1.1 이해 의뢰
1.1.1 방법 을 방법의 매개 변수 로 한다.
       우 리 는 먼저 이 제목 이 아무리 빙빙 돌려 도 의뢰 가 도대체 무엇 인지 간 에 아래 의 두 가지 가장 간단 한 방법 을 살 펴 보 자.그들 은 화면 에 인사 의 말 을 출력 하 는 것 에 불과 하 다.

public void GreetPeople(string name)
{
 EnglishGreeting(name);
}
 
public void EnglishGreeting(string name)
{
 Console.WriteLine("Good Morning, " + name);
}
       이 두 가지 방법 이 어떤 실제 적 인 의의 가 있 든 없 든 간 에.GreetPeople 은 누군가의 이름 을 대표 하 는 name 인 자 를 전달 하 는 데 사 용 됩 니 다.예 를 들 어"Liker"가 들 어 갈 때 이 방법 에서 EnglishGreeting 방법 을 호출 하여 name 인 자 를 다시 전달 합 니 다.EnglishGreeting 은 화면 에"Good Morning,Liker"를 출력 하 는 데 사 용 됩 니 다.
지금 이 프로그램 이 글로벌 화가 필요 하 다 고 가정 하면 어 머,큰일 났 어 요.저 는 중국 사람 이에 요.'Good Morning'이 무슨 뜻 인지 모 르 겠 어 요.어 떡 하 죠?좋 습 니 다.중국어 판 인사 방법 을 추가 하 겠 습 니 다.

public void ChineseGreeting(string name)
{
 Console.WriteLine("   , " + name);
}
이 럴 때 GreetPeople 도 고 쳐 야 한다.그렇지 않 으 면 어떤 버 전의 Greeting 인사 방법 이 적합 한 지 어떻게 판단 할 것 인가?이것 을 진행 하기 전에 우 리 는 매 거 진 것 을 판단 의 근거 로 다시 정의 하 는 것 이 좋 겠 다.

public enum Language
{
 English, Chinese
}

public void GreetPeople(string name, Language lang)
{
 switch (lang)
 {
  case Language.English:
   EnglishGreeting(name);
   break;
  case Language.Chinese:
   ChineseGreeting(name);
   break;
 }
}
OK.이렇게 문 제 를 해 결 했 지만 여러분 도 쉽게 생각 할 수 있 습 니 다.이 해결 방안 의 확장 성 이 매우 떨 어 집 니 다.만약 에 나중에 우리 가 한글 판,일본어 판 을 추가 해 야 한다 면 매 거 진 방법 과 GreetPeople()방법 을 반복 적 으로 수정 하여 새로운 수요 에 적응 해 야 합 니 다.
새로운 해결 방안 을 고려 하기 전에 GreetPeople 의 방법 으로 서명 하 는 것 을 살 펴 보 겠 습 니 다.
public void GreetPeople(string name, Language lang);
string name 만 봅 니 다.여기 서 string 은 매개 변수 형식 입 니 다.name 은 매개 변수 변수 입 니 다.name 문자열"Liker"를 부여 할 때"Liker"라 는 값 을 대표 합 니 다.우리 가 그것 에 게'이지 중'을 부 여 했 을 때,그것 은 또'이지 중'이라는 가 치 를 대표 하고 있다.그리고 우 리 는 방법 내 에서 이 name 에 대해 다른 조작 을 할 수 있 습 니 다.아,이 건 정말 쓸데없는 소리 야?절 차 를 배우 자마자 알았어.
만약 에 GreetPeople()방법 이 하나의 매개 변수 변 수 를 받 아들 일 수 있다 면 이 변 수 는 다른 방법 을 대표 할 수 있 습 니 다.우리 가 이 변수 에 EnglishGreeting 을 할당 할 때 이것 은 EnglsihGreeting()이라는 방법 을 대표 합 니 다.우리 가 그것 에 게 Chinese Greeting 을 부여 할 때,그것 은 또 Chinese Greeting()법 을 대표 한다.이 매개 변 수 를 MakeGreeting 이 라 고 명명 합 니 다.name 에 값 을 부여 할 때 처럼 GreetPeople()방법 을 호출 할 때 이 MakeGreeting 매개 변수 에 도 값 을 부여 할 수 있 지 않 습 니까?(ChineseGreeting 이나 EnglsihGreeting 등)그리고 우 리 는 방법 체 내 에서 다른 매개 변 수 를 사용 하 는 것 처럼 MakeGreeting 을 사용 할 수 있 습 니 다.그러나 MakeGreeting 은 하나의 방법 을 대표 하기 때문에 사용 방식 은 부 여 받 는 방법(예 를 들 어 ChineseGreeting)과 같 아야 합 니 다.예 를 들 어 MakeGreeting(name);
자,아이디어 가 생 겼 습 니 다.우 리 는 지금 GreetPeople()방법 을 바 꾸 겠 습 니 다.그러면 이 모양 일 것 입 니 다.

public void GreetPeople(string name, *** MakeGreeting)
{
  MakeGreeting(name);
}
***,이 위 치 는 보통 매개 변수의 유형 이 어야 한 다 는 것 을 알 게 되 었 습 니 다.그러나 지금까지 우 리 는 방법 을 대표 할 수 있 는 매개 변수 가 있어 야 한 다 는 생각 만 했 을 뿐 이 사고 에 따라 GreetPeople 방법 을 바 꾸 었 습 니 다.지금 은 큰 문제 가 발생 했 습 니 다.이것 은 방 법 을 대표 하 는 MakeGreeting 매개 변 수 는 어떤 유형 이 어야 합 니까?
설명:여 기 는 더 이상 매 거 할 필요 가 없습니다.MakeGreeting 에 값 을 부여 할 때 어떤 방법 을 사용 할 지 동태 적 으로 결정 하기 때 문 입 니 다.ChineseGreeting 인지 English Greeting 인지,이 두 가지 방법 내부 에 서 는'Good Morning'을 사용 할 지,아니면'좋 은 아침'을 사용 할 지 구분 되 었 습 니 다.
똑똑 한 당신 은 이미 생각 했 을 것 입 니 다.지금 은 의뢰 가 나 올 때 입 니 다.하지만 의뢰 를 하기 전에 Make Greeting 매개 변수 가 대표 할 수 있 는 Chinese Greeting()과 EnglishGreeting()방법의 서명 을 살 펴 보 겠 습 니 다.
public void EnglishGreeting(string name)
public void ChineseGreeting(string name)
name 은 String 형식의"true"와"1"을 받 아들 일 수 있 지만 bool 형식의 true 와 int 형식의 1 은 받 아들 일 수 없습니다.MakeGreeting 의 매개 변수 유형 정 의 는 MakeGreeting 이 대표 할 수 있 는 방법의 종 류 를 확정 할 수 있어 야 한다.더 나 아가 MakeGreeting 이 대표 할 수 있 는 방법의 매개 변수 유형 과 반환 유형 이다.
그래서 의뢰 가 나 타 났 습 니 다.MakeGreeting 매개 변수 가 대표 할 수 있 는 방법의 종류,즉 MakeGreeting 매개 변수의 유형 을 정의 합 니 다.
이 예 에서 의뢰 한 정의:
public delegate void GreetingDelegate(string name);
위의 English Greeting()방법의 서명 과 비교 해 보면 delegate 키 워드 를 추가 한 것 을 제외 하고 나머지 는 똑 같 지 않 습 니까?이제 GreetPeople()방법 을 다시 바 꿔 보 자.다음 과 같다.

public delegate void GreetingDelegate(string name);
public void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
 MakeGreeting(name);
}
보시 다시 피 GreetingDelegate 에 의뢰 한 위 치 는 string 과 같 습 니 다.string 은 하나의 유형 입 니 다.그러면 GreetingDelegate 도 하나의 유형 이거 나 클래스(Class)라 고 해 야 합 니 다.그러나 의뢰 한 성명 방식 과 유형 은 전혀 다르다.어떻게 된 일 일 까?실제로 컴 파일 을 의뢰 할 때 클래스 로 컴 파일 되 는 것 은 사실이다.Delegate 는 하나의 클래스 이기 때문에 성명 류 가 가능 한 모든 곳 에서 의뢰 를 성명 할 수 있 습 니 다.더 많은 내용 은 아래 에서 설명 할 것 입 니 다.지금 이 범례 의 전체 코드 를 보십시오.

public delegate void GreetingDelegate(string name);
 
class Program
{
 private static void EnglishGreeting(string name)
 {
  Console.WriteLine("Good Morning, " + name);
 }
 
 private static void ChineseGreeting(string name)
 {
  Console.WriteLine("   , " + name);
 }
 
 private static void GreetPeople(string name, GreetingDelegate MakeGreeting)
 {
  MakeGreeting(name);
 }
 
 static void Main(string[] args)
 {
  GreetPeople("Liker", EnglishGreeting);
  GreetPeople("   ", ChineseGreeting);
  Console.ReadLine();
 }
}
우 리 는 현재 의뢰 에 대해 정 리 를 하고 있 습 니 다.의뢰 는 하나의 유형 으로 방법의 유형 을 정의 하여 방법 을 다른 방법의 매개 변수 로 전달 할 수 있 습 니 다.이런 방법 을 매개 변수 에 동적 으로 부여 하 는 방법 은 프로그램 에서 If..Else(Switch)문 구 를 대량으로 사용 하 는 것 을 피 할 수 있 고 프로그램 이 더욱 확장 성 을 가지 게 할 수 있 습 니 다.
1.1.2 방법 을 의뢰 에 귀속
여기 보니까 약간 꿈 에서 깬 것 같 지 않 아 요?그래서 당신 은 생각 하고 있 습 니까?위의 예 에서 저 는 GreetPeople()방법 에서 name 매개 변 수 를 직접 할당 하지 않 아 도 됩 니 다.저 는 이렇게 변 수 를 사용 할 수 있 습 니 다.

static void Main(string[] args)
{
 GreetPeople("Liker", EnglishGreeting);
 GreetPeople("   ", ChineseGreeting);
 Console.ReadLine();
}
그리고 Greeting Delegate 에 의뢰 한 것 은 유형 string 의 위치 와 마찬가지 로 하나의 매개 변수 유형 을 정 의 했 기 때문에 저도 의뢰 를 이렇게 사용 할 수 있 지 않 습 니까?

static void Main(string[] args)
{
 GreetingDelegate delegate1, delegate2;
 delegate1 = EnglishGreeting;
 delegate2 = ChineseGreeting;
 GreetPeople("Liker", delegate1);
 GreetPeople("   ", delegate2);
 Console.ReadLine();
}
예상 한 대로 프로그램 이 예상 한 대로 출력 되 는 것 은 문제 가 없습니다.여기 서 제 가 말씀 드 리 고 싶 은 것 은 의뢰 가 string 과 다른 특성 입 니 다.여러 가지 방법 을 같은 의뢰 에 부여 하거나 여러 가지 방법 을 같은 의뢰 에 연결 하 라 고 할 수 있 습 니 다.이 의뢰 를 호출 할 때 바 인 딩 된 방법 을 순서대로 호출 합 니 다.이 예 에서 문법 은 다음 과 같다.

static void Main(string[] args)
{
 GreetingDelegate delegate1;
 delegate1 = EnglishGreeting; 
 delegate1 += ChineseGreeting;
 GreetPeople("Liker", delegate1);
 Console.ReadLine();
}
실제로 우 리 는 GreetPeople 방법 을 피해 의뢰 를 통 해 English Greeting 과 ChineseGreeting 을 직접 호출 할 수 있 습 니 다.

static void Main(string[] args)
{
 GreetingDelegate delegate1;
 delegate1 = EnglishGreeting;
 delegate1 += ChineseGreeting; 
 delegate1("Liker");
 Console.ReadLine();
}
설명:이 예 에 서 는 문제 가 없 지만 위 에 있 는 GreetPeople()의 정 의 를 돌 이 켜 보면 Englshih Greeting 과 Chinese Greeting 에 게 필요 한 일 을 할 수 있 습 니 다.간편 하기 위해 생략 했 습 니 다.
여기 주의 하 세 요.처음 사용 하 는'='은 값 을 부여 하 는 문법 입 니 다.두 번 째 는'+='로 바 인 딩 된 문법 입 니 다.'+='을 처음 사용 하면'할당 되 지 않 은 부분 변 수 를 사 용 했 습 니 다'라 는 컴 파일 오류 가 발생 합 니 다.우 리 는 또한 아래 의 코드 를 사용 하여 이 과정 을 이렇게 간소화 할 수 있다.

GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting;
의뢰 에 연결 할 수 있 는 방법 을 주 었 으 니 방법 에 대한 연결 을 취소 하 는 방법 도 있어 야 합 니 다.이 문법 은'-='이라는 것 을 쉽게 생각 할 수 있 습 니 다.

static void Main(string[] args)
{
 GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
 delegate1 += ChineseGreeting;
 GreetPeople("Liker", delegate1);
 Console.WriteLine();
 
 delegate1 -= EnglishGreeting;
 GreetPeople("   ", delegate1);
 Console.ReadLine();
}
우 리 는 다시 한 번 의뢰 에 대해 총 결 을 합 시다.
의뢰 를 사용 하면 여러 가지 방법 을 같은 의뢰 변수 에 연결 할 수 있 습 니 다.이 변 수 를 호출 할 때(이 변 수 는 하나의 방법 을 대표 하기 때 문 입 니 다)모든 바 인 딩 방법 을 순서대로 호출 할 수 있 습 니 다.
여기 서 C\#의 의뢰 용법 에 관 한 예제 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 관련 C\#의뢰 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기