반응형
공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
Delegate
C#의 delegate는
C 나 C++ 의 함수 포인터와도 비슷한 개념입니다.
메소드 파라미터와 반환 타입에 대한 정의 후 파라미터와
반환 타입이 일치하는 메소드를 서로 호환하여 불러 쓸 수 있습니다.
=====================================================
delegate 예제
using System;
using System.Text;
namespace workspace_csharp {
public class Program {
delegate void CallDelegate(int x);
private void Running(int xx){
System.Console.WriteLine(xx);
}
private void Running2(int xxx) {
System.Console.WriteLine(xxx + xxx);
}
public void Method() {
CallDelegate callDelegate = new CallDelegate(Running);
callDelegate(1000);
callDelegate = Running2;
callDelegate(2000);
}
public static void Main(String[] args) {
Program pg = new Program();
pg.Method();
}
}
}
이전 포스팅에서의 예제와 유사하죠?
추가된 점은 이미 선언한 delegate를 새롭게 객체생성하지 않고
파라미터와 반환 타입이 일치하는 다른 메소드로 변경할 수 있다는 점입니다.
=====================================================
=====================================================
Delegate를 메소드의 파라미터로
위 예제까지는 메소드를 delegate에 사용했는데요.
이번에는 메소드의 파라미터로 Delegate를 사용하는 예제입니다.
정수 배열의 값들을 오름차순과 내림차순 정렬을 하는 예제입니다.
using System;
using System.Text;
namespace workspace_csharp {
public class Program {
public delegate int CompareIntDele(int o1, int o2);
public static void Sorting(int[] arrays, CompareIntDele cid) {
if(arrays.Length < 2) {
return;
}
int result; // 0 or 1 or -1;
for(int i = 0; i < arrays.Length; i++) {
for(int j = i + 1; j < arrays.Length; j++) {
result = cid(arrays[i], arrays[j]);
if(result == -1) {
int temporary = arrays[j];
arrays[j] = arrays[i];
arrays[i] = temporary;
}
}
}
Show(arrays);
}
static void Show(int[] arrays) {
foreach(var value in arrays) System.Console.Write(value + "\t");
System.Console.WriteLine();
}
void Running() {
int[] points = {100, 94, 77, 83, 57, 42};
CompareIntDele cid = Ascending;
Sorting(points, cid);
cid = Descending;
Sorting(points, cid);
}
// CompareIntDele 와 파라미터와 반환 타입이 일치하는 메소드들
int Ascending(int o1, int o2) {
if(o1 == o2) return 0;
return (o2 > o1) ? 1 : -1;
}
int Descending(int o1, int o2) {
if(o1 == o2) return 0;
return (o2 < o1) ? 1 : -1;
}
// ======================================================
public static void Main(String[] args) {
new Program().Running();
}
}
}
이상입니다.
다음 포스팅에서는 delegate 세 번째 포스팅으로 delegate 필드와
delegate 속성에 대해 공부합니다.
반응형
'C#' 카테고리의 다른 글
C#문법-19 : Delegate - 1, delegate란?, 기본 사용 법 (0) | 2019.06.12 |
---|---|
C#문법-18 : 인터페이스 (0) | 2019.06.12 |
C#문법-17 : 제네릭 (0) | 2019.05.24 |
C#문법-16 : 속성과 static 클래스, 메소드, 필드, 속성 (0) | 2019.04.25 |
C#문법-15 : 클래스 상속 (0) | 2019.04.25 |