Delegate
Delegate 란 메서드의 시그내처 정보를 가지고 있는 포인터 이다. Delegate 가 사용되는 곳으로는 이벤트, 스레드, 비동기, 람다 가 있다.
Delegate 를 사용하는 3가지 단계가 있다. 외워라!!
1. 선언 : 선언은 Delegate 가 가르키게 될 메소드의 시그내처를 선언한다.
ex) delegate void MyDelegate1(string s)
2. 생성 : Delegate 는 메소드를 가르키게 되지만 컴파일 되면 하나의 클래스 객체가 된다. 이를 증명하듯 생성 시에는 new 연산자를 사용한다. 매개변수에는 가리킬 메소드 이름을 지정해 준다.
ex) MyDelegate1 a = new MyDelegate1(MyClass.Hello);
3. 호출 : 해당 메소드를 호출하듯 Delegate 이름을 이용하여 호출한다.
ex) a("Word");
Delegate 는 Single Delegate 와 Multicast Delegate 가 있다. Single delegate 는 하나의 메소드를 가리키고, Multi delegate 는 여러개의 메소드를 가리키게 된다. Single delegate 와 Multi delegate 의 구분은 해당 delegate 시그내처의 리턴값을 보고 판별한다. 즉, 리턴값이 있다면 single delegate 이고 리턴값이 없다면 Multi delegate 이다. Multi delegate 가 여러개의 메소드를 가리키고 있지만 해당 메소드는 순차적으로 실행이 되며, 여러개의 메소드 중 어느 하나의 리턴값을 정하긴 모하 하므로 Multi delegate 는 보통 리턴값을 갖지 않는다.
예제)
public partial class Form1 : Form { delegate void MyDelegate(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // SetColor(); 직접 호출 // 생성 // MyDelegate md = new MyDelegate(SetColor); // MyDelegate md2 = new MyDelegate(SetText); // MyDelegate md3 = new MyDelegate(SetLocation); // MyDelegate md4 = (MyDelegate)Delegate.Combine(md, md2, md3); // md4(); // C# 의존 문법 MyDelegate md = new MyDelegate(SetColor); md += new MyDelegate(SetText); md += new MyDelegate(SetLocation); md(); } public void SetColor() { button1.BackColor = Color.Green; } public void SetText() { button1.Text = "델리게이트"; } public void SetLocation() { button1.Location = new Point(100, 100); } }
Delegate 비동기 방식 사용
BeginInvoke, EndInvoke메소드 사용
자세한 사용법은 뒤에서 알아 본다고 한다....
namespace DelegateDemo_15 { // 선언 public delegate int AddDelegate(int i, int j); public class MyClass { public int AddTo(int i, int j) { System.Threading.Thread.Sleep(4000); return i + j; } } }
namespace DelegateDemo_15 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { MyClass mc = new MyClass(); // 생성 AddDelegate ad = new AddDelegate(mc.AddTo); // 호출 (동기 방식 호출) // int num = ad(int.Parse(textBox1.Text), int.Parse(textBox2.Text)); // MessageBox.Show(num.ToString()); // 호출2 (비동기 방식 호출) AsyncCallback ac = new AsyncCallback(CallBack); ad.BeginInvoke(int.Parse(textBox1.Text), int.Parse(textBox2.Text), ac, ad); MessageBox.Show("4초 후에 결과가 출력됩니다."); } public void CallBack(IAsyncResult ar) { AddDelegate ad = (AddDelegate)ar.AsyncState; int num = ad.EndInvoke(ar); MessageBox.Show(num.ToString()); } } }