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.FuncFunc 는 최소 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.predicate1.predicate 는 bool 형 으로 돌아 가 는 일반적인 의뢰 입 니 다.
2.predicate
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.익명 함수 와 lambda3.1 익명 함수 란 무엇 인가
익명 함 수 는'내 연'문구 나 표현 식 으로 의뢰 유형 이 필요 한 모든 곳 에서 사용 할 수 있 습 니 다.
익명 함 수 를 사용 하여 이름 의뢰 를 초기 화하 거나 이름 의뢰 를 전달 할 수 있 습 니 다.
MyDelegate funDelegate = delegate(string s) { Console.WriteLine(s); };
funDelegate ("this is anonymous delegate");
3.2.lambdalambda 표현 식 은 사실상 익명 함수 입 니 다.컴 파일 러 는 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 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.