c\#기초 지식---의뢰,익명 함수,lambda

선언:
       C\#의 의뢰(Delegate)는 C 나 C++의 함수 와 유사 한 지침 입 니 다.의뢰 는 어떤 방법 에 대한 인용 이 있 는 인용 형식 변수 입 니 다.인용 은 실행 중 변경 할 수 있 습 니 다.의뢰(Delegate)는 특히 이벤트 와 리 셋 방법 을 실현 하 는 데 사용 된다.모든 의뢰 는 System.Delegate 류 에서 파생 됩 니 다.하나의 방법 을 매개 변수 로 전달 하여 다른 방법 으로 호출 하여 집행 하 게 하 다.
1.의뢰 한 성명
위탁 성명 은 이 위탁 에서 인용 할 수 있 는 방법 을 결정 했다.의뢰 는 같은 라벨 을 가 진 방법 을 가리 킬 수 있 습 니 다.
1.1.delegate
1.1.1.0-23 개의 매개 변 수 는 반환 값 이 있 을 수도 있 고 반환 값 이 없 을 수도 있 습 니 다.

public delegate int MyDelegateEventHandler (string parm);
주:(1).이 의뢰 가 가리 키 는 방법 은 매개 변수 가 string 형식 이 어야 하 며,반환 형식 은 int 형식 이 어야 합 니 다.기타 성명 비교 소득.
(2).EventHandler 는 c\#명명 규범 입 니 다.물론 규범 을 이해 하면 마음대로 할 수 있 습 니 다.
       (3).호출 의뢰 시 null 여 부 를 판단 해 야 합 니 다.그렇지 않 으 면 이상 이 발생 합 니 다.
       (4).사건 도 의뢰
1.1.2.의뢰 의 호출

MyDelegateEventHandler fun=new MyDelegateEventHandler(method);
or
MyDelegateEventHandler fun=method;
// fun   ,       
 if (fun!= null)
 {
 fun(val);
 }
 //fun?.Invoke(val);       
1.1.3.의뢰 한 멀티캐스트
모든 의뢰 는 하나의 방법 으로 만 호출 되 며,여러 가지 방법 을 호출 하면 이 의뢰 를 여러 번 표시 해 야 합 니 다.만약 같은 위탁 이 여러 가지 방법 을 호출 한다 면,우 리 는 멀티캐스트 로 위탁 할 수 있다.

public delegate void MyDelegate ();

public voidMyMethod()
{
 //#
}
public void MyMethod1()
{
 //#
}
public void MyMethod2()
{
 //#
}
MyDelegateEnventHander myDelegate;
myDelegate=new MyDelegateEventHander(MyMethod);
myDelegate+=new MyDelegateEventHander(MyMethod1);
...........
//  
myDelegate();
 주:
1.의뢰 대상 은"+"연산 자 를 사용 하여 합병 할 수 있 습 니 다.
2."-"연산 자 는 통합 의뢰 에서 구성 요소 의뢰 를 제거 하 는 데 사용 할 수 있 습 니 다.
3.지 정 된 방법 유형 이 일치 해 야 합 니 다.
4.반환 형식 은 보통 void 이지 만 필요 하지 않 습 니 다.
5.GetInvocationList 의뢰 색인 가 져 오기

if (MyDelegate != null) 
 System.Delegate[] dels = MyDelegate .GetInvocationList(); 
for (int i = 0; i < dels.Length; i++) 
  {
 MyDelegate -= dels[i] as MethodDelegate;
   }
이상 은 GetInvocationList 를 이용 하여 의뢰 색인 을 가 져 오 는 간단 한 응용 프로그램 입 니 다.
1.2.Action
Action 최소 0 개의 인자,최대 16 개의 인자,반환 값 이 없습니다.

Action     ,       
Action<int,string>        int,string       
Action<int,string,bool>        int,string,bool       
Action<int,int,int,int>      4 int   ,       

 public void Test<T>(Action<T> action,T p)
 {
 action(p);
 }
1.3.Func
Func 는 최소 0 개의 매개 변수,최대 16 개의 매개 변 수 를 반환 값 에 따라 범 형 으로 되 돌려 줍 니 다.반환 값 이 있어 야 합 니 다.void 가 안 됩 니 다.

Func          
Func<int>     ,    int   
Func<object,string,int>        object, string     int   
Func<object,string,int>        object, string     int   
Func<T1,T2,,T3,int>        T1,T2,,T3(  )    int   
1.4.predicate
1.predicate 는 bool 형 으로 돌아 가 는 일반적인 의뢰 입 니 다.
2.predicate는 입력 인자 가 int 로 bool 을 되 돌려 주 는 의뢰 를 표시 합 니 다.
3.Predicate 는 하나의 인자 만 있 고 반환 값 은 bool 로 고정 되 어 있 습 니 다.

public delegate bool Predicate<T> (T obj)
2.의뢰 의 정례 화
2.1.delegate

public delegate int MyDelegateEventHandler (string parm)
public int MyMethod(string parm)
{
 //#
}
MyDelegateEventHandler MyDelegate=new MyDelegateEventHandler(MyMethod)
주:실례 화 를 의뢰 할 때 의뢰 대상 은 new 키 워드 를 사용 하여 만들어 야 하 며 특정한 방법 과 관련 이 있 습 니 다.위탁 매개 변수 중의 방법 은 매개 변 수 를 포함 하지 않 습 니 다.
2.2.Action 의 사용

public void Test<T>(Action<T> action, T p)
 {
 action(p);
 }
 private void Action(string s)
 {
 #
 }
//  
Test<string>(Action,"wyl");
2.3.Func 의 사용

public int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
{
 return func(a, b);
}
private int Fun(int a, int b)
{
 #
}
//  
Test<int,int>(Fun,100,200)
2.4 거품 정렬 의뢰

//    
class Student
 {
 public string Name { get; private set; }
 public decimal Scores{ get; private set; }

 public Student(string name, decimal scores)
 {
 this.Name = name; this.Scores= scores;
 }
 public override string ToString()
 {
 return string.Format("{0},{1:C}",Name,Scores);
 }
 public static bool CompareScores(Student e1,Student e2)
 {
 return e1.Scores< e2.Scores;
 }
 }
//        
class BubbleScores
 {
 public static void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
 {
 bool swapped = true;
 do
 {
 swapped = false;
 for (int i = 0; i < sortArray.Count - 1; i++)
 {
  if (comparison(sortArray[i + 1], sortArray[i]))
  {
  T temp = sortArray[i];
  sortArray[i] = sortArray[i + 1];
  sortArray[i + 1] = temp;
  swapped = true;
  }
 }
 } while (swapped);
 }
 }
//  
Student[] students={new Student("wyl", 100),#};
BubbleSorter.Sort(students, Student.CompareScores);
foreach(var student in students)
 Console.WriteLine(student);
3.익명 함수 와 lambda
3.1 익명 함수 란 무엇 인가
익명 함 수 는'내 연'문구 나 표현 식 으로 의뢰 유형 이 필요 한 모든 곳 에서 사용 할 수 있 습 니 다.
익명 함 수 를 사용 하여 이름 의뢰 를 초기 화하 거나 이름 의뢰 를 전달 할 수 있 습 니 다.

MyDelegate funDelegate = delegate(string s) { Console.WriteLine(s); };
funDelegate ("this is anonymous delegate");
3.2.lambda
lambda 표현 식 은 사실상 익명 함수 입 니 다.컴 파일 러 는 lambda 를 본 후에 클래스 에서 새로운 개인 적 인 방법 을 자동 으로 정의 합 니 다.lambda 는 의뢰 와 일치 해 야 합 니 다!그 중에서 lambda 는 c\#3.0 이후 에 인용 되 었 다.
lambda 의 문법:
매개 변수=>방법 체.
=>왼쪽 은 들 어 올 매개 변수 입 니 다.이 예 는 Int 형식의 변수 입 니 다.=>오른쪽 은 구체 적 인 코드 입 니 다.

//       :
()=>Console.WriteLine("Hello World!")
//      :
(int n)=>Console.WriteLine(n.ToString()) 
//    () int           :
n=>Console.WriteLine(n.ToString())
//      :
(int n ,int m)=>Console.WriteLine(n+m) 
//           :
(n , m)=>Console.WriteLine(m+n)
4.종합:
1.C++함수 포인터 와 유사 한 의뢰.
2.의뢰 는 방법 을 매개 변수 로 전달 할 수 있 습 니 다.
3.의뢰 는 리 셋 방법 을 정의 하 는 데 사용 할 수 있 습 니 다.
4.의뢰 는 연결 가능;멀티캐스트
5.방법 은 의뢰 서명 과 완전히 일치 하지 않 아 도 됩 니 다.
이상 은 c\#기초 지식-의뢰,익명 함수,lambda 의 상세 한 내용 입 니 다.c\#의뢰,익명 함수,lambda 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기