자세하게 정리해놓은 곳 링크 : 감사합니다. 감사합니다.
http://blog.naver.com/rocabilly?Redirect=Log&logNo=140133538660
델리게이트를 쓰는 이유 ??
델리게이트는 자기에게 전달된 함수를 대신 실행시켜주는 역활을 하는 함수 포인터
자신에게 할당된 함수를 대신 실행시켜 줍니다.
이벤트는 델리게이트 기반하여 만들어 졌습니다
어떤 Action(Event)을 정해놓고 다른 개발자에게 해당 Action(Event) 대로 함수를 구현 하라고 규약을 정해놓을때
(본인은 Action에 대한 포인터 즉 델리게이터만 실행하면 되니까..^^)
각 함수들을 일렬로 나열해서 실행 시킬수 있다는 겁니다.
추후에 나오는 LINQ(익명메소드, 람다표현식)등에는 참 잘 쓰일 거라는...
using System;
namespace 무명메서드
{
//[!]대리자 선언
public delegate void SayHandler(string mag);
//3번
public class Button
{
//이벤트 생성
public event SayHandler Click; //SayHandler 대리자타입 사용으로 Click 이벤트 생성
//이벤트 핸들러 생성
public void OnClick(string msg) //이벤트 발생 메서드 (이벤트 핸들러 생성)
{
if (Click != null)
{
Click(msg);
}
}
}
public class Program
{
public static void Say(string msg) { Console.WriteLine(msg); }
public static void Say2(string msg) { Console.WriteLine(msg+"2"); }
public static void Say3(string msg) { Console.WriteLine(msg+"3"); }
public static void Main(string[] args)
{
//[1] 메서드 호출
Say("일반적으로 메서드 호출");
////[2]대리자를 통해서 대신 호출
SayHandler sh = new SayHandler(Say); // a.delegate 생성과 함께 Say함수 등록
sh += new SayHandler(Program.Say); // b.생성된 delegate에 say함수를 등록
sh += Say; // c.생성된 delegate에 say함수를 등록
sh("델리게이트 등록 후"); //delegate가 say 함수 호출 => say가 3번 등록 되었으므로 3번 호출
sh -= new SayHandler(Program.Say); //등록된 함수를 제거
sh -= Say; //등록된 함수를 제거
sh("델리게이트 제거 후"); //delegate가 say 함수 호출 => say가 제거 되었으므로 1번 호출
sh += Say2; sh += Say3; sh("say2, say3 함수 등록 후 : 순차적으로 호출"); // 등록된 순서로 say, say2, say3를 호출
//[3] 이벤트와 이벤트 처리기를 통하여 등록해서 호출
Button btn = new Button();
btn.Click += new SayHandler(Say); //기본형 .......번개모양 : 이벤트
btn.Click += Say;//축약형
btn.OnClick("이벤트 핸들러");//실행
//[4]익명메서드 : Say 함수를 작성하지 않고 익명메서드로 작성
SayHandler hi = delegate(string msg)
{
Console.WriteLine(msg);
};
hi("익명메서드");
//[5]익명메서드 : Button의 click event를 익명 메서드로 작성
Button button = new Button();
button.Click += delegate(string msg)
{
Console.WriteLine(msg);
};
button.OnClick("이벤트 익명메서드");
//[6]람다표현식 : Button의 click event를 Ramda 표현식으로 작성
Button button1 = new Button();
button1.Click += (string msg) => Console.WriteLine(msg);
button.OnClick("람다 표현식");
}
}
}
Func , Action : 아주 유연한 메소드 호출을 가능
Func 델리게이트와 Action 델리게이트는 같은 역활을 합니다.
Action 도 Func 처럼 system 네임스페이스안에 선언
큰 차이점은 위임된 메소드가 처리되고 결과값이 반환되느냐 아니냐 차이
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FuncAndActionPractice { class Program { static void Main(string[] args) { //Func<out TResult> //Func<in T1, out TResult> //Func<in T1,in T2, out TResult> //Func<in T1,in T2,...in T16, out TResult> //제일 오른쪽 끝이 리턴 타입이고 앞에 인자들(T1,T2,..)은 각각 Input 파라미터의 타입 Console.WriteLine("명시적 메소드"); Func<int, string> func1 = deleMethod; Console.WriteLine(func1(10)); Console.WriteLine("익명 메소드"); Func<int, string> func2 = delegate(int num) { return "익명 메소드 :" + num.ToString() + "개 입니다."; }; Console.WriteLine(func2(20)); Console.WriteLine("람다식"); Func<string ,string> func3 = num => { return "람다식:" + num.ToString() + "개 입니다";}; Console.WriteLine(func3("30")); //Action //Action <in T1> //Action <in T1,in T2> //Action <in T1,in T2,...in T16> Action<string> action1 = name => { Console.WriteLine(name + " delelgate i am."); }; Action action2 = () => { Console.WriteLine("delelgate i am without inpu parameter."); }; action1("Action"); action2(); } public static string deleMethod(int num) { return " 명시적 메소드 : " + num.ToString() + " 개 입니다"; } } }