C\#의 의뢰 데이터 형식 안내

의뢰 란 무엇 인가?
의뢰 는 프로그램 에서 나중에 호출 될 다른 방법(또는 여러 방법)을 가리 키 는 보안 대상 입 니 다.쉽게 말 하면 의뢰 는 방법 을 인용 할 수 있 는 대상 이다.의뢰 를 만 들 면 인용 방법의 대상 을 만 들 고 그 방법 을 호출 할 수 있다.즉,의뢰 는 그 가 가리 키 는 방법 을 호출 할 수 있다.
다음 예 를 들 어 delemthod 는 세 가지 방법 을 정 의 했 습 니 다.add,minus 와 multi 는 모두 같은 입력 매개 변수 목록(int x,int y)과 출력 매개 변수 유형 int 를 가지 고 있 습 니 다.그러면 이 세 가지 방법 은 똑 같은 방법 으로 서명 합 니 다.개발 자 는 int 의 특정한 이름(int x,int y)의 한 유형 으로 방법 을 패키지 할 수 있 습 니 다.c\#에서 이러한 추상 적 인 데이터 형식 을 의뢰 라 고 합 니 다.상기 몇 가지 방법 에 대해 우 리 는 의뢰 를 정의 할 수 있 습 니 다.Public delegate int Handler(int x,int y),Public 는 방문 수정자 입 니 다.delegate 키 워드 는 이것 이 의뢰 임 을 표시 합 니 다.int Hander(int x,int y)이 의뢰 의 이름 을 표시 합 니 다.

class deleMethod
{
public int add(int x, int y)
{
return x + y;
}
public int minus(int x, int y)
{
return x - y;
}
public int multi(int x, int y)
{
return x * y;
}
}
의뢰 를 어떻게 사용 합 니까?
사용 의뢰 는 크게 네 가지 절차 가 있 습 니 다.
•의뢰 를 정의 합 니 다.지난 절 에 언급 되 었 습 니 다.
•의뢰 방법 을 정의 합 니 다.지난 절 deleMethod 류 에서 add,minus,multi 는 모두 의뢰 방법 입 니 다.정의 의 목적 은 이 를 사용 하기 위 한 것 입 니 다.전문 적 인 것 은 방법 호출 을 위 한 것 입 니 다.
•위탁 변수 및 할당 값 은 유형 과 마찬가지 로 사용 하기 전에 변수 에 할당 해 야 합 니 다.
•위탁 변수의 사용.
의뢰 변 수 를 어떻게 정의 합 니까?아니면 위의 예 를 이 어 갑 니까?우 리 는 의뢰 유형 Public delegate int Handler(int x,int y)를 정 의 했 습 니 다.c\#문법 규범 과 같이 변 수 를 정의 하고 값 을 부여 하 는 문법 은'유형 명 변수 명=new 유형 명(방법)'입 니 다.전례대로
"Handler deleCall=new Handler(방 법 명);",.net 2.0 이후 의뢰 에 대한 정례 화 는'Handler deleCall=방법론 명'으로 간소화 할 수 있다.
위탁 변수의 사용,즉 위탁 방법 에 대한 호출 입 니 다.그 문법 은'int result 1=deleCall(10,20)'이다.또는 위탁 호출 방법 인 Invoke,"int result 2=deleCall.Invoke(10,20);"를 사용 합 니 다.
구체 적 으로 어떻게 사용 하 는 지 아래 의 예 를 볼 수 있다.

class Program
{
public delegate int Handler(int x, int y); //---       ,                
static void Main(string[] args)
{ 
deleMethod dm = new deleMethod(); //---            
Handler deleCall = new Handler(dm.add); //---      delCall,      
int result1 = deleCall(10, 20); //---       invoke
Console.WriteLine("the add resutl is:{0}", result1);
deleCall = dm.minus;
int result2 = deleCall.Invoke(12, 6);
Console.WriteLine("the minus result is:{0}", result2);
Console.ReadLine();
}
} 
상례 에서 보 듯 이 간단 한 더하기,감소 기능 을 정의 하 는 것 이 이렇게 복잡 하 다.이리 저리 휘 저어 머리 를 어 지 럽 히 는 것 은 정말 어이 가 없다.어쩐지 많은 친구 들 이 의뢰 색 이 어 지 러 워 지 는 것 이 당연 하 다.실제 사용 하 는 과정 에서 c\#코드 를 간소화 하 는 방법 이 많 습 니 다.
의뢰 를 간소화 하 다
미리 정 의 된 일반적인 의뢰
c\#시스템 에서 가장 흔히 볼 수 있 는 미리 정 의 된 의뢰 유형 은 세 가지 가 있 습 니 다.Func<>의뢰,Action<>의뢰,Predicate<>의뢰,Func<>의뢰 는 반환 값 이 있 는 의뢰 로 입력 매개 변 수 는 16 개 에 달 합 니 다.한편,Action<>의뢰 는 반환 값 이 없 는 의뢰 로 입력 매개 변수 도 16 개 에 달 할 수 있 습 니 다.Predicate<>는 bool 반환 형식 을 가 진 의뢰 로 입력 매개 변수 만 실행 합 니 다.상기 의뢰 유형 에 대해 우 리 는 미리 정 의 된 의뢰 유형 Fun를 사용 하여 대체 할 수 있 습 니 다.우리 가 어떤 귀신 을 정의 하 는 지 아 닌 Public delegate int Handler(int x,int y)유형 을 사용 할 수 있 습 니 다.그 코드 는 다음 과 같이 간략화 할 수 있 습 니 다.

namespace DelegateDemo1
{
class Program
{
static void Main(string[] args)
{
deleMethod dm = new deleMethod();
Func<int, int, int> fun = dm.add; //---          Func<>
int result4 = fun(8, 10);
Func<int, int, int> fun1 = dm.minus;
int result5 = fun1(12, 8);
Console.WriteLine("        {0},{1}", result4, result5);
Console.ReadLine();
}
}
class deleMethod
{
public int add(int x, int y)
{
return x + y;
}
public int minus(int x, int y)
{
return x - y;
}
public int multi(int x, int y)
{
return x * y;
}
}
}
나 는 의뢰 의 방법 정의 와 의뢰 의 호출 을 함께 보면 원래 자신 이 정의 한 의뢰 유형 보다 간단 하고 편리 하지 않 습 니까?하지만 이렇게 의뢰 를 사용 하 는 것 은 시원 하지 않 아 실제 응용 에 서 는 코드 를 어떻게 쓰 는 사람 이 별로 없 을 것 같 아 불편 하 다.
익명 의뢰
위탁 사례 의 호출 과 위탁 방법의 정 의 를 분리 하여 처리 할 때 코드 농민 들 은 프로그램 코드 를 읽 을 때 의뢰 방법 을 찾 아 의뢰 변 수 를 일치 시 켜 야 한다.매개 변수 목록 과 반환 값 이 정확 한 지 확인 해 야 한다.이런 프로그램 코드 의 가 독성 이 매우 떨어진다.사실 c\#코드 를 간소화 하 는 방법 이 있 습 니 다.그것 은 바로 익명 의뢰 입 니 다.방법 체 를 의뢰 의 실례 화 할 때 제시 하 는 것 입 니 다.익명 의뢰 라 고 부 르 는 이 유 는 의뢰 를 재 정의 할 때 의뢰 의 이름 을 생략 하 는 것 입 니 다.그 정의 문법 은 delegate(매개 변수 1,매개 변수 2)다음 에 방법 체 를 직접 제시 하고 대괄호 로 방법 체 를 묶 는 것 입 니 다.방금 이상 하 게 보 였 는데 많이 접 하면 익숙해 져 서 c\#의 문법 규범 에 적응 할 수 밖 에 없 었 다.말 이 많 으 면 물이 지 코드 를 보 는 것 이 직접적 이다.

namespace DelegateDemo1
{
class Program
{
static void Main(string[] args)
{
Func<int, int, int> fun = delegate(int x, int y) { return x + y; };
Func<int, int, int> fun1 = delegate(int x, int y) { return x - y; };
int result4 = fun(8, 10);
int result5 = fun1(12, 8);
Console.WriteLine("        {0},{1}", result4, result5);
Console.ReadLine();
}
}
} 
원래 의 기초 위 에서 코드 의 양 을 대폭 줄 였 는 지,부 었 는 지,코드 의 양 이 이미 극치 로 줄 었 는 지 살 펴 보 자.
lambda 표현 식
사실 의뢰 에 대한 정 의 는 더욱 간소화 할 수 있 습 니 다.그것 은 바로 lambda 표현 식 을 사용 하 는 것 입 니 다.lambda 표현 식 의 정 의 는(매개 변수 목록)=>{방법 체},=>goes to 로 읽 습 니 다.lambda 표현 식 은 매개 변수 목록 과 방법 표현 식 에 대한 간소화 가 극 에 달 했 습 니 다.위의 예 에 대해 서 는...λ표현 식 은 익명 으로 의뢰 한 키워드 와 매개 변수 유형 을 생략 할 수 있 습 니 다.시스템 은 유형 추정 을 할 수 있 고 운행 에 영향 을 주지 않 습 니 다.간단 한 코드 는 다음 과 같 습 니 다..net 1.0,2.0 의 가장 전통 적 인 위탁 정의 와 사용 은 커 다란 간소화 로 모든 불필요 한 문 구 를 제거 하여 극치 에 이 르 렀 다.

namespace DelegateDemo1
{
class Program
{
static void Main(string[] args)
{
Func<int, int, int> fun = (x, y) => x + y;
Func<int, int, int> fun1 = (x, y) => x - y; 
int result4 = fun(8, 10);
int result5 = fun1(12, 8);
Console.WriteLine("        {0},{1}", result4, result5);
Console.ReadLine();
}
}
} 
위탁 체인
앞에서 말 했 듯 이 의뢰 는 본질 적 으로 하나의 유형 입 니 다.우 리 는 delegate 키워드 로 성명 한 모든 의뢰 는 System.MulticastDelegate 에서 계승 합 니 다.후 자 는 System.Delegate 류,System.Delegate 류 는 System.Object 에서 계승 한다.하나의 의뢰 는 같은 서명 방법 으로 하나의 의뢰 체인 을 만 들 수 있 습 니 다.의뢰 체인 은 의뢰 사례 의 집합 입 니 다.이 집합 에서 의뢰 사례 가 대표 하 는 모든 방법(반환 값 이 있 는 방법 에 대해 의뢰 체인 의 반환 값 은 링크 의 마지막 방법의 반환 값)을 호출 할 수 있 습 니 다.아래 의 예 에서 우리 가 정의 한 의뢰 방법 은 모두 값 을 되 돌려 주지 않 았 다.우 리 는 GetInvocationList()방법 으로 의뢰 체인 을 얻 을 수 있 습 니 다.

class Program
{
static void Main(string[] args)
{
//Action             
Action<int, int> actionA = (x, y) =>
{
Console.WriteLine("x {0},y {1},       {2}", x, y, x * x + y * y);
};
actionA += (x, y) =>
{
Console.WriteLine("x {0},y {1},       {2}", x, y, x * x - y * y);
};
actionA(10, 5); 
foreach (var item in actionA.GetInvocationList())
Console.WriteLine(item.Method);
Console.ReadLine();
}
} 
사건 이란 무엇 인가
사건 은 특수 한 의뢰 이 고 의뢰 에 대한 패키지 라 는 정 의 를 자주 볼 수 있다.사실 이런 정 의 는 매우 엄밀 하지 않다.의뢰 는 일종 의 데이터 형식 이지 만 사건 은 의뢰 의 실례 일 뿐 데이터 형식 이 라 고 할 수 없 기 때문에 사건 은 특수 한 의뢰 라 는 것 은 정확 하지 않다.이렇게 정의 하면 이 벤트 는 특수 한 의뢰 실례 이 고 의뢰 에 대한 봉인 입 니 다.그렇다면 C\#에서 이 벤트 는 어떻게 정의 되 고 사 용 됩 니까?사실 사건 은 정의 에서 사용 까지 네 단 계 를 거 쳐 야 한다.
•이벤트 의존 의뢰 를 정의 하고 이벤트 및 이 벤트 를 일 으 키 는 방법 을 정의 합 니 다.이 절 차 는 이벤트 발표 기 클래스 에서 정의 할 수 있 습 니 다.
•이벤트 에 의존 하 는 이벤트 방법 을 정의 합 니 다.이 절 차 는 이벤트 구독 자 클래스 에서 정의 할 수 있 습 니 다.
•이벤트 매개 변수 가 있 으 면 이벤트 매개 변수 클래스 에서 정의 할 수 있 습 니 다.
•이벤트 등록 및 이벤트 발생,이 절 차 는 주 프로그램 에 적 혀 있 습 니 다.
일반적으로 이벤트 정의 과정 에서 각 방법의 명명 은 통 일 된 기준 이 없 지만,우 리 는 마이크로소프트 가 c\#에서 의 명명 규범 을 참고 하여 명명 할 수 있다.
이벤트 의뢰 이름 을 제안 합 니 다:이벤트+EventHandler.추가 적 인 매개 변수 전달 이 있 으 면 자신의 매개 변수 유형 을 정의 해 야 합 니 다.매개 변수 형식의 명명 규범:이벤트+EventHandler.예 를 들 어 하나의 이벤트 의뢰 Public delegate void calcEventHandler(object sender,calcEventArgs)를 정의 할 수 있 습 니 다.
다음 과 같은 이벤트 변 수 를 정의 합 니 다:Public event calcEventHandler calc;
이 벤트 를 일 으 키 는 방법 을 정의 합 니 다:Public void onCalc(object sender,calcEventArgs){}
제안 방법 은 on+이벤트 입 니 다.웹 프로그램 을 개발 할 때 바 인 딩 된 이벤트 이름 이 onClick,onLoad 등 과 같 습 니 다.
아래 의 예 를 참고 하여 하나의 사건 을 정의 하 는 일반적인 과정 을 알 아 보 세 요.사건 을 전달 하 는 매개 변수 가 필요 하지 않 으 면 사건 매개 변수 류 의 정 의 를 줄 일 수 있 고 시스템 이 미리 정의 한 EventArgs 를 사용 하면 됩 니 다.

/// <summary>
///     
/// </summary>
class Program
{
static void Main(string[] args)
{
eventPublish myEvent = new eventPublish();
eventSubscription myMethod = new eventSubscription();
//     add   subtract,            -=          
myEvent.calc += myMethod.add;
myEvent.calc += myMethod.substract;
while (true)
{
try
{
Console.WriteLine("         ");
int numA = Convert.ToInt16(Console.ReadLine());
Console.WriteLine("        ");
int numB = Convert.ToInt16(Console.ReadLine());
calcEventArgs e = new calcEventArgs(numA, numB);
//      sender  ,        "sender"
myEvent.onCalc("sender", e); 
}
catch (Exception ex)
{
Console.WriteLine("    ," + ex.Message);
}
}
}
}
/// <summary>
///           
/// </summary>
class eventPublish
{
//        ,            +EventHandler
public delegate void calcEventHander(object sender,calcEventArgs e);
//        ,     calc
public event calcEventHander calc;
//    ,            ,            on+     
public void onCalc(object sender, calcEventArgs e)
{
if (calc != null)
calc(sender,e);
}
}
/// <summary>
///           (     )
/// </summary>
class eventSubscription
{
public void add(object sender, calcEventArgs e)
{
Console.WriteLine("      {0}", e.X + e.Y );
}
public void substract(object sender, calcEventArgs e)
{
Console.WriteLine("      {0}", e.X - e.Y);
}
}
/// <summary>
///          
/// </summary>
class calcEventArgs : EventArgs
{
private int _x;
private int _y;
public calcEventArgs(int x, int y)
{
this._x = x;
this._y = y;
}
public int X
{
get { return _x; }
}
public int Y
{
get { return _y; }
}
}
우 리 는 이 벤트 를 의뢰 에 대한 패키지 로 할 것 입 니 다.만약 ILDAS 로 실행 가능 한 파일 을 역 컴 파일 하여 중간 코드 를 보면 이벤트 실행 메커니즘 을 매우 명확 하 게 볼 수 있 습 니 다.

위의 그림 에서 보 듯 이 이벤트 calc 는.net 이 실 행 될 때 중간 언어 로 컴 파일 된 후에 private calc 속성 이 생 겼 고 add 도 자동 으로 생 성 되 었 습 니 다.calc 와 removecalc 방법,구독 자 등록 및 취소 방법.이벤트 가 봉 인 된 것 이기 때문에 calc 속성 은 private 이지 만 게시 기 내부 에 서 는 calc(sender,e)와 같은 방법 으로 직접 호출 할 수 있 습 니 다.그러나 주 프로그램 에서 이렇게 사용 하면 오류 가 발생 하여 onCalc 방법 으로 만 간접 호출 할 수 있 습 니 다.
후기
이 글 은 처음에 의뢰 가 무엇 인지 에 대한 의문 을 제기 하고 의뢰 가 무엇 인지 에 대한 이 해 를 강화 하기 위해 몇 가지 방법 을 도입 했다.두 번 째 부분 에 서 는 의뢰 를 사용 하 는 네 가지 절 차 를 설명 하고 예 를 들 어 이 몇 가지 절 차 를 논술 했다.세 번 째 부분 에 서 는 의뢰 사용 간소화 문 제 를 다 루 고 있 으 며,범 형 의뢰 를 통 해 사용자 정의 의뢰 를 간소화 하고,익명 의뢰 를 통 해 의뢰 방법 을 간소화 할 수 있다.익명 의뢰 는 의뢰 를 정의 할 때 방법 체 를 직접 제시 하 는 것 으로 lambda 표현 식 의 유형 을 사용 하여 의뢰 의 사용 을 더욱 간소화 할 수 있 을 것 으로 추정 된다.네 번 째 부분 에 서 는 의뢰 체인 을 통 해 바 인 딩 방법 으로 의뢰 를 초기 화하 고+=을 통 해 더 많은 의뢰 방법 을 바 인 딩 합 니 다.다섯 번 째 부분 에 서 는 사건 의 정의 와 사용 의 네 가지 절 차 를 다 루 었 다.물론 의뢰 한 사용 장면 도 많 습 니 다.예 를 들 어 BeginInvoke 와 EndInvoke 를 통 해 비동기 호출 을 하 는 것 은 본 문장의 중점 이 아니 기 때문에 글 에 언급 되 지 않 았 습 니 다.
이상 의 내용 은 편집장 님 께 서 소개 해 주신 C\#의 의뢰 데이터 형식 소개 입 니 다.도움 이 되 셨 으 면 좋 겠 습 니 다!

좋은 웹페이지 즐겨찾기