대리자는 메서드에 대한 참조를 나타내는 형식입니다.
대리자의 인스턴스를 통해 메서드를 호출할 수 있습니다.
- “대표하다”. 대신 처리한다는 의미입니다.
- 대리자를 사용하여 다른 메서드를 호출할 수 있습니다.
- 호출되는 메서드의 반환 유형은 매개변수의 수 및 데이터 유형과 일치해야 합니다.
- 하나의 대리자 호출에서 여러 메서드를 호출할 수 있습니다.
- 이벤트 처리기, 스레딩 등에 사용됩니다.
다음은 대리자 선언의 예입니다.
사람들 대표하다 int Calc(int a, int b); |
대리자 선언은 호출되는 메서드의 반환 값 및 매개 변수와 일치해야 합니다.
공공 int 플러스(int a, int b) { a+b를 반환합니다. } Cal c = 더하기 기호; // 델리게이트 인스턴스 선언 c(10, 20); // 추가하다 메서드 호출 |
대리자를 사용하여 다른 메서드를 호출하는 간단한 예를 들어 보겠습니다.
예 1
1. 프로젝트를 생성합니다.
- Windows Forms 애플리케이션(.NET 프레임워크)
2. 양식에 목록 상자와 버튼을 추가합니다.
3. 버튼에 다음 코드를 작성합니다.
using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;
namespace Delegate_1
{
public partial class Form1 : Form
{
delegate void MyCalc(int a, int b);
public Form1()
{
InitializeComponent();
}
private void Plus(int a, int b)
{
listBox1.Items.Add(String.Format($"{a} + {b} = {a + b}"));
}
private void button1_Click(object sender, EventArgs e)
{
MyCalc md = Plus;
md(20, 10);
}
}
}
대리자는 여러 메서드를 하나로 결합하여 단일 호출에서 여러 메서드를 실행할 수 있습니다.
예 2
1. 위에서 만든 프로젝트에 버튼(button2)을 추가하고 코드를 추가합니다.
2. 완성된 코드는 다음과 같습니다.
using System;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace Delegate_1
{
public partial class Form1 : Form
{
delegate void MyCalc(int a, int b);
public Form1()
{
InitializeComponent();
}
private void Plus(int a, int b)
{
listBox1.Items.Add(String.Format($"{a} + {b} = {a + b}"));
}
private void Minus(int a, int b)
{
listBox1.Items.Add(String.Format($"{a} - {b} = {a - b}"));
}
private void Division(int a, int b)
{
listBox1.Items.Add(String.Format($"{a} * {b} = {a * b}"));
}
private void button1_Click(object sender, EventArgs e)
{
MyCalc md = Plus;
md(20, 10);
}
private void button2_Click(object sender, EventArgs e)
{
MyCalc md = Plus;
md(20, 10);
md = Minus;
md(20, 10);
md = (MyCalc)Delegate.Combine(
new MyCalc(Plus),
new MyCalc(Minus),
new MyCalc(Division));
md(20, 10);
}
}
}