간단 한 이야기 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\#사건 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.