간단 한 이야기 c\#사건

7539 단어 c#이벤트
머리말:
앞의 몇 가지 주제 에서 의뢰 에 대해 상세 하 게 소개 한 다음 에 우 리 는 코드 를 작성 하 는 과정 에서'이벤트'라 는 개념 을 자주 들 을 수 있 습 니 다.특히 UI 를 쓸 때 단 추 를 누 르 면 VS 는 자동 으로 배경 코드 를 만들어 주 고 Click 방법 에 코드 만 쓰 면 됩 니 다.그래서 C\#를 접 하 자마자 당연 하 다 고 생각 하 는 친구 들 도 있 을 것 입 니 다.왜 그런 지 생각 하지 않 았 을 것 입 니 다.왜 이 벤트 를 클릭 하면 우리 가 Click 방법 에 쓴 코드 를 촉발 시 킬 수 있 습 니까?사건 은 도대체 어떤 역할 을 맡 았 을 까?이러한 의혹 을 해소 하기 위해 사건 을 상세히 소개 하여 일부 초보 자 들 로 하여 금 C\#중의 사건 의 개념 을 깊이 이해 하 게 하 였 다.
1.왜 C\#에 사건 이 있 습 니까?
앞의 주제 에서 제 가 왜 의뢰 를 해 야 하 는 지 이 해 했 습 니 다.그래서 제 가 이해 하 는 왜 C\#에서 사건 이라는 개념 을 도입 해 야 하 는 지 공유 하 겠 습 니 다.다음은 생활 속 사건 의 예 를 간단하게 말씀 드 리 겠 습 니 다.최근 에 제 생일 이 막 지 났 습 니 다.저 는 생일 이라는 화제 로 이 야 기 를 하려 고 합 니 다.날 이 하루 하루 지나 가 고 생일 날짜 가 도 착 했 을 때 생일 사건 을 촉발 시 켰 습 니 다.이때 생일 을 보 낸 사람 은 바로 생일 사건 을 촉발 시 키 는 대상 입 니 다.그리고 어떤 관 계 를 가 진 친구 들 은 이 사건 에 관심 을 가 질 것 입 니 다.이 사건 이 발생 하면 그들 은 당신 과 함께 생일 을 축하 하고 선물 을 줄 수 있 습 니 다.물론 모든 사람 이 당신 의 생일 에 관심 을 가 지 는 것 은 아 닙 니 다.어떤 사람들 은 전혀 모 를 것 입 니 다.당신 의 생일 사건 에 관심 을 가 진 사람 만 이 선물 을 줄 것 입 니 다.이런 생활 속 의 생일 과정 이지 만 왜 C\#에 사건 이 있 는 지 에 대한 개념 은 당연히 더 잘 이해 할 수 있다.C\#는 대상 을 대상 으로 하 는 언어 이다.우리 가 C\#언어 로 인 코딩 을 하 는 것 도 코드 로 우리 가 현실 생활 속 의 일 을 완성 하 는 데 도움 을 주기 위해 서 이다.그래서 당연히 사건 이 있어 야 생활 속 에서 발생 하 는 상황 을 반영 해 야 한다.
2.자신 은 어떻게 사건 모델 을 실현 합 니까?
이제 우 리 는 왜 C\#이 이 벤트 를 도입 해 야 하 는 지 알 게 되 었 습 니 다.그러나 코드 에서 사용 하 는 이벤트 의 대부분 은.net 라 이브 러 리 에서 제공 합 니 다.예 를 들 어 컨트롤 의 각종 이벤트,우 리 는 단 추 를 누 르 기만 하면 이 벤트 를 터치 합 니 다.그러나 우 리 는 이 사건 이 어떻게 촉발 되 는 지 이해 하고 싶 습 니 다.우 리 는 이벤트 모드 를 실현 하 는 프로그램 을 스스로 정의 할 수 있 습 니까?답 은 당연히 가능 하 다.다음은 위의 생일 의 예 를 들 어 코드 를 통 해 하나의 사건 모델 을 어떻게 실현 하 는 지 설명 한다.
구체 적 인 코드 는:

using System;
using System.Threading;

namespace BirthdayEventDemo
{
  class Program
  {
    static void Main(string[] args)
    {
      //           
      Me eventSource = new Me("Learning Hard");

      //           
      Friend1 obj1 = new Friend1();
      Friend2 obj2 = new Friend2();

      //                  
      eventSource.BirthDayEvent+=new BirthDayEventHandle(obj1.SendGift);
      eventSource.BirthDayEvent+=new BirthDayEventHandle(obj2.Buycake);
      
      //           ,     
      eventSource.TimeUp();
      Console.Read();
    }
  }
  //    :                            
  public class BirthdayEventArgs : EventArgs
  {
    //          
    private readonly string name;

    public string Name
    {
      get { return name;}
    }

    public BirthdayEventArgs(string name)
    {
      this.name = name;
    }
  }
  //    :        ,            ,                 
  public delegate void BirthDayEventHandle(object sender, BirthdayEventArgs e);
  //       
  public class Subject
  {
    //       
    public event BirthDayEventHandle BirthDayEvent;

    //    :             ,         (      )
    protected virtual void Notify(BirthdayEventArgs e)
    {
      //          ,                     
      BirthDayEventHandle temp = Interlocked.CompareExchange(ref BirthDayEvent, null, null);
      if (temp != null)
      {
        //     ,          
        //         ,           
        temp(this, e);
      }
    }
  }

  //          ,   
  public class Me : Subject
  {
    private string name;
    public Me(string name)
    {
      this.name = name;
    }
    public void TimeUp()
    {
      BirthdayEventArgs eventarg = new BirthdayEventArgs(name);
      //     ,     
      this.Notify(eventarg);

    }
  }

  //     
  public class Friend1
  {
    public void SendGift(object sender,BirthdayEventArgs e)
    {
      Console.WriteLine(e.Name+"     ,     ");
    }
  }
  public class Friend2
  {
    public void Buycake(object sender, BirthdayEventArgs e)
    {
      Console.WriteLine(e.Name + "     ,       ");
    }
  }
}
실행 결 과 는:

3.컴 파일 러 는 사건 을 어떻게 해석 합 니까?
위 에서 우 리 는 자신 이 하나의 사건 모델 을 실현 하 는 방법 을 소개 했다.여러분 은 코드 를 전개 하여 구체 적 으로 볼 수 있 습 니 다.실현 과정 은 주로 트리거 대상 을 정의 하 는 사건 원(누가 생일 을 보 내 는 지 말 합 니 다)->생일 사건 에 관심 을 가 지 는 친구 대상 을 정의 합 니 다->방법 으로 사건 에 대한 관심 을 등록 합 니 다.이벤트 가 실 행 될 때 등록 을 알 리 는 방법 이 호출 되 었 습 니 다.그러나 여러분 에 게 아직도 의문 이 있다 고 믿 습 니 다.도대체 C\#중의 사건 은 무엇 입 니까?컴 파일 러 는 또 어떻게 그것 을 설명 합 니까?다음은 여러분 의 의혹 을 풀 어 드 리 겠 습 니 다.
먼저 사건 은 의뢰 한 것 입 니 다.(정확히 말 하면 사건 은 의뢰 체인 입 니 다)위의 코드 에서 우리 가 정의 한 사건 은 이벤트 키 워드 를 사용 하 는 것 외 에 의뢰 유형 도 사 용 했 습 니 다.그러나 의뢰 는 하나의 유형 입 니 다.클래스 는 속성 필드 가 있 을 것 입 니 다.그러나 우 리 는 사건 을 의뢰 의 속성 으로 이해 할 수 있 습 니 다.속성의 반환 값 은 의뢰 유형 입 니 다.사건 은 의뢰 의 속성 이 고 근거 가 있 습 니 다.우 리 는 중간 언어 코드 를 통 해 컴 파일 러 가 우리 가 정의 한 사건 을 어떻게 설명 하 는 지 알 수 있 습 니 다.

 //    :        ,            ,                 
  public delegate void BirthDayEventHandle(object sender, BirthdayEventArgs e);
  //       
    public event BirthDayEventHandle BirthDayEvent;
위 에서 정의 한 이벤트 와 같이 컴 파일 러 는 3 단 코드 로 변환 합 니 다.(여러분 은 IL 어 셈 블 리 프로그램 을 통 해 볼 수 있 습 니 다.)

// 1.        null       
    private BirthDayEventHandle BirthDayEvent =null;

    //2.     add_BirthDayEvent  
    public void add_BirthDayEvent(BirthDayEventHandle value)
    {
      //                     
    }
    // 3.      remove_BirthDayEvent  
    public void remove_BirthDayEvent(BirthDayEventHandle value)
    {
      //                     
    }
첫 번 째 코드 는 의뢰 의 개인 필드 입 니 다.이 필드 는 의뢰 목록 의 머리 에 대한 참조 입 니 다.이벤트 가 발생 하면 이 목록 의 의뢰 를 알려 줍 니 다.필드 가 null 로 초기 화 되 었 습 니 다.관심 이 없 는 사람 이 이벤트 에 대한 관심 을 등록 한 것 을 나타 냅 니 다.
두 번 째 코드 는 add 를 접두사 로 하 는 방법 입 니 다.이 방법 은 컴 파일 러 가 자동 으로 이름 을 지 었 습 니 다.코드 내용 은 Delegate.Combine 방법 으로 의뢰 인 스 턴 스 를 의뢰 목록 에 추가 하고 새로운 목록 주 소 를 되 돌려 주 며 이 주 소 를 필드 에 저장 합 니 다.
세 번 째 코드 도 하나의 방법 입 니 다.대상 이 이벤트 에 대한 관심 을 취소 하 게 합 니 다.같은 방법 체 는 Delegate.Remove 방법 으로 의뢰 인 스 턴 스 를 의뢰 목록 에서 삭제 하고 새로운 목록 주 소 를 되 돌려 주 며 이 주 소 를 필드 에 저장 합 니 다.(주,추가 되 지 않 은 방법 을 삭제 하려 면 Delegate.Remove 방법 은 내부 에서 아무것도 하지 않 습 니 다.즉,한 번 도 던 지지 않 고 경고 도 표시 하지 않 으 며 이벤트 의 방법 집합 은 변 하지 않 습 니 다).
또한 여러분 은 디 버 깅 을 통 해 사건 이 의뢰 체인 이라는 것 을 설명 할 수 있 습 니 다.여러분 은 eventSource.BirthDay Event+=new BirthDay Event Handle(obj 2.Buycake)에서이 줄 코드 는 정지점 디 버 깅 을 설정 합 니 다.다음은 제 가 디 버 깅 하 는 과정 에서 캡 처 한 것 입 니 다.여러분 도 직접 디 버 깅 을 해 보 실 수 있 습 니 다.그러면 사건 이 의뢰 체인 이라는 개념 을 더욱 이해 할 수 있 습 니 다.

F10 으로 한 줄 을 실행 한 후 캡 처

위의 캡 처 를 통 해 여러분 들 은 사건 이 의뢰 체인 이라는 개념 에 대해 진일보 한 이 해 를 가 질 것 이 라 고 믿 습 니 다.
소결
여기까지 본 주제 의 내용 도 소 개 했 습 니 다.본 주 제 를 통 해 여러분 들 은 사건 에 대해 진일보 한 이 해 를 가지 고 사건 과 의뢰 간 의 관 계 를 이해 할 수 있 기 를 바 랍 니 다.이 주 제 는 자신 이 실현 한 이벤트 모델 을 통 해 사건 의 본질 을 설명 합 니 다.그러나 우 리 는 Net 라 이브 러 리 에서 정 의 된 사건 을 자주 사용 합 니 다.그러나 C\#를 처음 접 한 사람들 은 Net 에서 정 의 된 사건 뒤에 하 는 일 을 이해 하지 못 합 니 다.단 추 를 누 른 후에 Click 방법 에 자신의 제어 코드 를 기록 하 는 것 만 알 고 있 습 니 다.그러나 뒤의 과정 은 구체 적 으로 어떤 것 입 니까?사건 이 의뢰 인 만큼 Click 사건 은 의뢰 유형 인 데 그 중 의뢰 유형 은 어떻게 정례 화 되 나 요?이 내용 들 은 다음 주제 에서 모두 에 게 공유 할 것 이다.
이상 은 c\#사건 의 상세 한 내용 을 간단하게 이야기 하 는 것 입 니 다.c\#사건 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기