2.0보다 이전 버전의 C#에서는 명명된 메서드를 사용하는 방법으로만 대리자를 선언할 수 있었습니다.
C# 2.0에는 무명 메서드가 도입되었고 C# 3.0 이상에서는 무명 메서드 대신 람다 식을 사용하여 인라인 코드를
작성하는 방법이 더 좋습니다.
1.익명메서드
// Create a delegate. delegate void Del(int x); // Instantiate the delegate using an anonymous method. Del d = delegate(int k) { /* ... */ };
무명 메서드를 사용하면 별도의 메서드를 만들 필요가 없으므로 대리자를 인스턴스화하는 데 따르는
코딩 오버헤드를 줄일 수 있습니다.
예를 들어, 메서드를 생성할때 불필요한 오버헤드가 발생된다면 대리자(delegate) 대신에 코드블록을 사용
하는 것이 좋습니다. 또 다른 예는 새로운 스레드를 시작할 때입니다.
다음 클래스는 스레드를 만들고 스레드에서 실행할 코드도 포함하므로 대리자를 위한 추가 메서드를
만들 필요가 없습니다.
void StartThread() { System.Threading.Thread t1 = new System.Threading.Thread (delegate() { System.Console.Write("Hello, "); System.Console.WriteLine("World!"); }); t1.Start(); }
2.람다식
람다 식을 만들려면 람다 연산자 => 왼쪽에 입력 매개 변수를 지정하고(있는 경우) 다른 쪽에 식이나 문 블록을 넣습니다.
예를 들어, 람다 식 x => x * x는 이름이 x인 매개 변수를 지정하고 x 제곱 값을 반환합니다.
다음 예제와 같이 대리자 형식에 이 식을 할당할 수도 있습니다.
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 }
람다식은 두가지의 방법이 존재합니다.
2-1 식 람다(expression)
=> 연산자의 오른쪽에 식이 있는 람다 식을 식 람다라고 합니다.
괄호는 람다 식에 입력 매개 변수가 하나뿐인 경우에만 생략할 수 있고 그렇지 않으면 생략할 수 없습니다.
둘 이상의 입력 매개 변수는 다음과 같이 괄호로 묶고 쉼표로 구분해야 합니다.
(x, y) => x == y
컴파일러에서 입력 형식을 유추할 수 없는 경우도 있습니다. 이와 같은 경우에는 다음 예제와 같이 형식을
명시적으로 지정할 수 있습니다.
(int x, string s) => s.Length > x
2-2 문 람다(statement)
문 람다는 다음과 같이 중괄호 안에 문을 지정한다는 점을 제외하면 식 람다와 비슷합니다.
문 람다의 본문에 지정할 수 있는 문의 개수에는 제한이 없지만 일반적으로 2-3개 정도만 지정합니다.
delegate void TestDelegate(string s); … TestDelegate myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); }; myDel("Hello");
'프로그래밍 > C#' 카테고리의 다른 글
[C#] if else VS switch 어떤것을 사용할까? (0) | 2017.03.06 |
---|---|
[C#] 파일 처리 (폴더 생성 , 파일 생성 및 로드 ) (0) | 2017.02.21 |
[C#] Func<T, TResult> Delegate (델리게이트 캡슐화) (0) | 2015.05.04 |
[C#] 델리게이트 ( delegate , 대리자 ) (0) | 2015.04.22 |
[C#] Dispose VS Finalize (0) | 2015.04.14 |