C\#의 의뢰 를 자세히 설명 합 니 다.

9894 단어 C#의뢰 하 다.
이 물건 을 부탁 하 는 것 은 이해 하기 어렵 지만 일 을 하면 서 자주 사용 합 니 다.당신 은 어디서나 그 모습 을 볼 수 있 습 니 다.정말 사랑 하고 미워 하 는 느낌 이 듭 니 다.나 는 많은 사람들 이 그것 에 시 달 렸 다 고 믿 습 니 다.
의뢰 하면 C 언어 를 배 웠 다 면 함수 지침 을 바로 연상 할 것 이다.
의뢰 란 무엇 인가?의뢰 는 C\#중 형식 이 안전 합 니 다.같은 서명 방법 을 가 진 함수 지침 을 하나 이상 구독 할 수 있 습 니 다.의뢰 는 함 수 를 매개 변수 로 전달 할 수 있 는데 그 실제 적 인 의 미 는 바로 다른 사람 이 당신 의 일 을 대리 하 게 하 는 것 입 니 다.의뢰 는 함수 의 지침 으로 볼 수 있 습 니 다.정 수 는 정수 변수 로 가리 킬 수 있 고 대상 은 대상 변수 로 가리 킬 수 있 습 니 다.
함수 도 위탁 변수 로 그것 을 가리 킬 수 있다.우 리 는 의뢰 유형 을 하나의 방법 만 정 의 된 인터페이스 로 볼 수 있 고 의뢰 의 인 스 턴 스 는 그 인 터 페 이 스 를 실현 하 는 대상 으로 볼 수 있다.
사용 의뢰,4 가지 조건 을 만족 시 켜 야 합 니 다:
  • 성명 의뢰 유형;
  • 실행 할 코드 를 포함 하 는 방법 이 있어 야 합 니 다.
  • 은 의뢰 인 스 턴 스 를 만들어 야 합 니 다.
  • 은 인 스 턴 스 를 호출 해 야 합 니 다.
  • 위탁의 소명
    설명 의뢰 방식:delegate 반환 값 형식 의뢰 형식 이름(매개 변수)
    의뢰 한 설명 과 인터페이스 방법의 설명 은 기본적으로 일치 하지만,형식 키 워드 를 되 돌려 주 는 앞 에 delegate 키 워드 를 하나 더 추가 하 였 습 니 다.그리고 일반 성명 을 Public 형식 으로 의뢰 하 는 것 도 있 습 니 다.언제든지 다른 사람 이 호출 할 수 있 기 때 문 입 니 다.
    의뢰 의 본질 도 한 유형 이다.우 리 는 하나의 유형 이 실례 화 될 수 있 고,같은 위탁 도 실례 화 할 수 있다 고 성명 한다.
    다음 과 같은 네 가지 의뢰 가 있 습 니 다.
    
    //1.       
        public delegate void NoParaNoReturnEventHandler();
        //2.       
        public delegate void WithParaNoReturnEventHandler(string name);
        //3.       
        public delegate string NoParaWithReturnEventHandler();
        //4.       
        public delegate string WithParaWithReturnEventHandler(string name);
    코드 가 작업 을 수행 하려 고 하지만 작업 디 테 일 을 모 르 면 의뢰 를 사용 할 수 있 습 니 다.예 를 들 어 Thread 클래스 가 새 스 레 드 에서 무엇 을 실행 해 야 하 는 지 아 는 유일한 이 유 는 새 스 레 드 를 시작 할 때 ThreadStart 나 Parameterized ThreadStart 의뢰 인 스 턴 스 를 제공 하 는 것 입 니 다.
    
    Thread th = new Thread(Test);
    th.Start();
    public Thread(ThreadStart start);
    public delegate void ThreadStart();
    ThreadStart 는 반환 값 이 없 는 의뢰 입 니 다.
    
        static void Test()
        {
          Console.WriteLine("    ");
        }
    이 Test 방법의 함수 서명 은 ThreadStart 에 의뢰 한 함수 서명 과 일치 해 야 합 니 다.
    위탁 호출
    먼저 실례 화 된 위탁 을 한 후에 다시 호출 해 야 한다.
    함수 의 서명 과 의뢰 의 서명 이 일치 해 야 합 니 다.NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = ConsoleInfo;,컴 파일 러 가 new 를 진행 해 주 었 지만 NoParaNo Return EventHandler 라 고 쓸 수 없습니다.NoParaNoReturnEventHandler = ConsoleInfo();
    이렇게 해서 함수 호출 이 되 었 기 때문이다.
    
    #region         
        public static void Show()
        {
          //     
          NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = new NoParaNoReturnEventHandler(ConsoleInfo);
          //NoParaNoReturnEventHandler _NoParaNoReturnEventHandler = ConsoleInfo; //  
          //       Invoke()  ,        
          _NoParaNoReturnEventHandler.Invoke();
          //_NoParaNoReturnEventHandler();
        }
        private static void ConsoleInfo()
        {
          Console.WriteLine("            ");
        } 
        #endregion
    

    의뢰 가 없 으 면 비동기 가 없다.비동기 가 바로 의뢰 의 존재 때문이다.
    _NoParaNoReturnEventHandler.BeginInvoke(null,null); //비동기 호출
    의뢰 를 왜 사용 하 는 지
    우 리 는 완전히 직접 방법 을 호출 할 수 있 는데,왜 또 하나의 위탁 을 통 해 호출 해 야 합 니까?의뢰 는 무슨 의미 가 있 습 니까?
    디 결합,수정 닫 기,확장 열 림.논리 적 분리.
    의뢰 를 함수 의 부모 클래스 나 방법의 자리 표시 자로 이해 할 수 있 습 니 다.
    우 리 는 다음 코드 를 살 펴 보 겠 습 니 다.두 가지 방법 이 있다 고 가정 합 니 다.하 나 는 영 어 를 말 하고 하 나 는 중국 어 를 말 합 니 다.이 두 가지 방법의 함수 서명 은 같 습 니 다.
    
    public static void SayChinese(string name)
        {
          Console.WriteLine("  ," + name);
        }
        public static void SayEnglish(string name)
        {
          Console.WriteLine("hello," + name);
        }
    그럼 우리 가 외부 에서 호출 할 때,
    
      MyDelegate.SayChinese("  ");
      MyDelegate.SayEnglish("zhangsan");
    만약 이 두 가지 다른 방법 을 호출 하려 면,다른 호출 코드 를 써 야 합 니까?
    우 리 는 단지 한 가지 방법 으로 호출 할 수 있 습 니까?수정 코드 는 다음 과 같 습 니 다:
    
    public static void Say(string name,WithParaNoReturnEventHandler handler)
        {
          handler(name);
        }
       public static void SayChinese(string name)
        {
          Console.WriteLine("  ," + name);
        }
        public static void SayEnglish(string name)
        {
          Console.WriteLine("hello," + name);
        }
    이렇게 한 가지 방법 으로 만 Say 를 호출 합 니 다.
    어떻게 호출 합 니까?다음 세 가지 호출 방식:
    
          WithParaNoReturnEventHandler _WithParaNoReturnEventHandler = new WithParaNoReturnEventHandler(MyDelegate.SayChinese);
          MyDelegate.Say("  ",_WithParaNoReturnEventHandler);
          MyDelegate.Say("  ", delegate(string name) { Console.WriteLine("  ," + name); }); //    
          MyDelegate.Say("  ", (name) => { Console.WriteLine("  ," + name); }); //lambda   
    상기 코드 는 몇 가지 호출 방식 을 사 용 했 는데 이런 호출 방식 은 모두 C\#의 업그레이드 에 따라 계속 최적화 되 었 다.첫 번 째 는 C\#1.0 에 존재 하 는 전통 적 인 호출 방식 이 고 두 번 째 는 C\#2.0 의 익명 방법 호출 방식 이다.익명 방법 이란 이름 이 없 는 방법 이다.방법 이 한 번 만 호출 될 때 익명 방법 을 사용 하 는 것 이 가장 적합 하 다.C\#3 의 lambda 표현 식 입 니 다.사실 범 형 의뢰 역시 지원 되 고.NET 3.5 는 한 단계 더 나 아가 Func 라 는 범 형 의뢰 유형 을 도 입 했 습 니 다.여러 가지 지정 한 유형의 인 자 를 얻 고 다른 지정 한 유형의 값 을 되 돌려 줍 니 다.
    lambda 표현 식
    lambda 표현 식 의 본질은 하나의 방법 이 고 익명 의 방법 입 니 다.
    만약 방법 체 가 한 줄 만 있 고 반환 값 이 없다 면 대괄호 와 분 호 를 제거 할 수 있다.MyDelegate.Say(" ", (name) => Console.WriteLine(" ," + name));방법 체 가 한 줄 밖 에 없 으 면 되 돌아 오 는 값 이 있 으 면 괄호 와 return 을 제거 할 수 있 습 니 다.WithParaWithReturnEventHandler _WithParaWithReturnEventHandler = (name)=>name+", ";.NET 3.5 부터 기본적으로 우리 스스로 의뢰 를 설명 할 필요 가 없다.왜냐하면 시스템 에 내 장 된 의뢰 가 많 기 때문이다.
    액 션 과 펑 크 의뢰 는 각각 16 개,17 개의 무 거 운 짐 이 실 렸 다.int 는 입력 매개 변 수 를 표시 하고 out 은 반환 값 을 대표 하 며 out 매개 변 수 는 마지막 에 놓 습 니 다.
    Action 은 반환 값 이 없 는 의뢰 를,Func 는 반환 값 이 있 는 의뢰 를 표시 합 니 다.방법 은 큰 각도 에서 분류 되 기 때문에 반환 값 이 있 는 방법 과 반환 값 이 없 는 방법 으로 나 뉜 다.


    즉,구체 적 으로 어떤 방법 을 사용 하 는 지 는 완전히 호출 자가 결정 하면 더욱 큰 유연성 과 확장 성 을 가진다.왜 이렇게 말 합 니까?만약 에 제 가 어떤 때 는 영 어 를 먼저 말 하고 중국 어 를 말 해 야 합 니 다.어떤 일 은 중국 어 를 먼저 말 하고 영 어 를 말 해 야 합 니 다.만약 에 의뢰 가 없 으 면 우 리 는 어떻게 실현 합 니까?다음 코드 를 보십시오.
    
    public static void SayEnglishAndChinese(string name)
        {
          SayEnglish(name);
          SayChinese(name);
        }
        public static void SayChineseAndEnglish(string name)
        {
          SayChinese(name);
          SayEnglish(name);
        }
    갑자기 러시아 어 를 추가 하려 면?호출 된 측의 코드 를 또 수정 해 야 하 는데,이렇게 순환 하면 미 치 겠 지?새로운 언어 가 계속 추가 되면 서 코드 는 점점 복잡 해 지고 유지 하기 어려워 질 것 이다.이러한 코드 의 결합 성 이 매우 높 고 불합리 하 다.즉,이른바 코드 의 나 쁜 맛 이 나 타 났 다.디자인 모델(예 를 들 어 관찰자 모델 등)을 통 해 의뢰 를 사용 하지 않 고 코드 를 재 구성 할 수 있 지만 실현 하기 가 매우 번 거 롭 고 더 많은 코드 를 써 야 한다.
    의뢰 는 방법 을 전달 할 수 있 고 이런 방법 은 일련의 조작 을 대표 할 수 있다.이런 조작 은 모두 호출 자가 결정 하면 확장 이 잘 되 고 매우 유연 하 다.우 리 는 기 존의 방법 을 수정 하지 않 고 방법 을 추가 하 는 형식 으로 만 확장 할 것 이다.
    내 가 직접 호출 자 에 게 호출 을 해 야 한다 고 말 할 수도 있 습 니 다.내 가 어떤 방법 을 실행 해 야 이런 효 과 를 실현 할 수 있 습 니까?
    그러나 당신 은 당신 이 사용 하고 자 하 는 것 이 일련의 방법 이 라 고 생각해 본 적 이 있 습 니까?당신 은 이 일련의 방법 을 전혀 복용 할 수 없습니다.의뢰 를 사용 하면 달라 집 니 다.그것 은 하나의 방법 으로 집합 한 용기 와 같 습 니 다.당신 은 안 으로 증감 방법 을 사용 할 수 있 고 재 활용 할 수 있 습 니 다.그리고 의뢰 를 사용 하면 방법 목록 의 호출 을 지연 시 킬 수 있 고 방법 목록 을 수시로 증감 할 수 있 습 니 다.방법 에 대해 다시 한 번 포장 을 의뢰 하 였 다.
    결론:즉,방법의 함수 서명 만 확정 할 수 있 고 방법의 구체 적 인 집행 이 확정 되 지 않 을 때 더욱 잘 확장 되 기 위해 주입 방법 과 유사 한 형식 으로 새로운 기능 을 실현 하면 의뢰 의 가 치 를 나 타 낼 수 있다.
    의뢰 와 직접 호출 함수 의 차이:의뢰 를 사용 하면 임의의 함 수 를 가리 킬 수 있 습 니 다.이전에 정의 되 지 않 았 던 것 이라도 몇 가지 에 제한 을 받 지 않 아 도 됩 니 다.
    멀티캐스트 의뢰
    그룹의 의뢰 는 반드시 같은 유형 이 어야 하 며,조합의 순서에 따라 순서대로 호출 되 는 새로운 의뢰 대상 을 만 드 는 것 과 같다.의뢰 한 조합 은 일반적으로 사건 에 사용 되 며,일반 의뢰 를 할 때 는 거의 사용 되 지 않 는 다.
    +를 통 해 의뢰 인 스 턴 스 에 방법 을 추가 하고-의뢰 인 스 턴 스 에서 방법 을 제거 합 니 다.
    +와-순 전 히 코드 를 간소화 하기 위해 생 긴 것 으로 실제 적 으로 Delegate.Combine 방법 과 Delegate.Remove 를 호출 합 니 다.
    의뢰 에 반환 값 을 가 져 오 는 방법 이 여러 개 있 으 면 의뢰 의 반환 값 을 호출 하 는 것 이 마지막 방법의 반환 값 입 니 다.
    
    public static void MultipleShow()
        {
          //    
          NoParaWithReturnEventHandler _NoParaWithReturnEventHandler = new NoParaWithReturnEventHandler(GetDateTime);
          _NoParaWithReturnEventHandler += GetDateTime;
          Console.WriteLine(_NoParaWithReturnEventHandler());
        }
        public static string GetDateTime()
        {
          return string.Format("   {0} 。", DateTime.Now.Day.ToString());
        }

    의뢰 총화:
  • 의뢰 는 특수 반환 유형 과 한 조 의 매개 변 수 를 포함 하 는 행 위 를 밀봉 하고 단일 한 방법 을 포함 하 는 인터페이스 와 유사 합 니 다.
  • 의뢰 유형 성명 에서 설명 한 형식 서명 은 의뢰 인 스 턴 스 를 만 드 는 데 사용 할 수 있 는 방법 을 결정 하 는 동시에 호출 된 서명 을 결정 합 니 다.
  • 의뢰 인 스 턴 스 를 만 들 기 위해 서 는 하나의 방법 과(인 스 턴 스 방법 에 있어)호출 방법의 목표 가 필요 합 니 다.
  • 의뢰 인 스 턴 스 는 String 처럼 변 하기 쉽 지 않 습 니 다.
  • 모든 의뢰 인 스 턴 스 는 호출 목록-하나의 조작 목록 을 포함 합 니 다.
  • 이 벤트 는 의뢰 실례 가 아니 라 쌍 을 이 루 는 add/remove 방법(속성 과 유사 한 값 추출 방법/값 부여 방법)입 니 다.
  • 일반적인 사용 장면:창 값,스 레 드 시작 시 바 인 딩 방법,lambda 표현 식,비동기 등.
    생활 속 의 예:지금 은 모두 가 기차 표를 빼 앗 고 있 지 않 습 니까?클 라 우 드 로 표를 빼 앗 는 것 은 의뢰 를 사용 하 는 것 과 같 습 니 다.당신 은 직접 표를 살 수도 있 고 클 라 우 드 로 표를 빼 앗 는 것 도 맡 길 수 있 습 니 다.자신 이 표를 빼 앗 으 려 면 총 을 쏘 려 고 할 때 항상 갱신 해 야 합 니 다.다음 에 인증번호 등 클 라 우 드 로 표를 빼 앗 으 면 표를 넣 기 전에 미리 티켓 빼 앗 는 정 보 를 입력 해 야 합 니 다.더 이상 네가 관여 할 필요 가 없다.자동 으로 표를 낸다.너 는 구름 이 표를 빼 앗 는 쪽 에서 어떻게 너 를 도와 표를 빼 앗 는 지 전혀 알 필요 가 없다.같은 시간 과 차 는 하나의 위탁 사례 를 만 들 수 있 고 많은 사람들 이 이 위탁 사례 를 통 해 표를 빼 앗 는 작업 을 한다.
    원본 다운로드:http://pan.baidu.com/s/1dEPlxJj
    이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기