728x90
- 델리게이트(delegate)
- 대리자(메소드 참조형)
- 메소드의 틀을 만들어 소통
- 클래스간 통신에 활용
- 문법 : delegate 리턴형 식별자(파라미터);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _116_delegate
{
delegate int DelegateFunc(int a);
class Program
{
static int Add(int a)
{
Console.WriteLine("Add");
return a + a;
}
static void Main(string[] args)
{
DelegateFunc delegateFunc = Add; //delegateFunc(Add) 대리 참조
Console.WriteLine("delegateFunc : " + delegateFunc(10));
}
}
}
- 델리게이트 선언 방법
- 기본 선언
DelegateTest dt = new DelegateTest(Sum);
- 간략한 선언
DelegateTest dt2 = Sum;
- 익명 함수 선언
DelegateTest dt3 = delegate(int a, int b)
{
Console.WriteLine("a + b = " (a + b));
};
- 람다식 선언
DelegateTest dt4 = (a, b) =>
{
Console.WriteLine("a + b = " + (a + b));
};
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _117_delegateDeclare
{
delegate void DelegateTest(int a, int b);
class Program
{
static void Sum(int a, int b)
{
Console.WriteLine("a + b = " + (a + b));
}
static void Main(string[] args)
{
// 1 : 기본 선언
DelegateTest dt = new DelegateTest(Sum);
// 2 : 간략한 산언
DelegateTest dt2 = Sum;
// 3 : 익명 함수 선언
DelegateTest dt3 = delegate (int a, int b)
{
Console.WriteLine("a + b = " + (a + b));
};
// 4 : 람다식 선언
DelegateTest dt4 = (a, b) =>
{
Console.WriteLine("a + b = " + (a + b));
};
dt(1, 1);
dt2(2, 2);
dt3(3, 3);
dt4(4, 4);
dt = delegate (int a, int b) //dt를 새롭게 정의되면 위의 sum과는 별개로 초기화된다
{
Console.WriteLine("a - b : " + (a - b));
};
dt(2, 1);
}
}
}
- 델리게이트 함수 파라미터 활용
- 일반적인 사용
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _118_delegateParam
{
delegate void delegaterFunc();
class MessageProcess
{
delegaterFunc CallOkFunc;
delegaterFunc CallCancelFunc;
public void Message(string msg, delegaterFunc okFunc, delegaterFunc cancelFunc)
{
CallOkFunc = okFunc;
CallCancelFunc = cancelFunc;
Console.WriteLine("Message : " + msg + " (0 : ok, 1 : cancel)");
string inputStr = Console.ReadLine();
if(inputStr.Equals("0"))
{
CallOkFunc();
}
else
{
CallCancelFunc();
}
}
}
class Program
{
static void CallOK()
{
Console.WriteLine("CallOK");
}
static void CallCancel()
{
Console.WriteLine("CallCancel");
}
static void Main(string[] args)
{
MessageProcess msg = new MessageProcess();
msg.Message("Test Message", CallOK, CallCancel);
}
}
}
- 이벤트(event)
- delegate와의 차이점
1) 할당 연산자(=) 사용 불가
2) 클래스 외부 호출 불가
3) 클래스 멤버 필드에서 사용
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _119_event
{
public delegate void delegateEvent(string msg);
class InDelegate
{
public delegateEvent myDelegate;
public event delegateEvent myEvent;
public void DoEvent(int a, int b)
{
if (null != myEvent)
myEvent("DoEvent : " + (a + b)); // == ConsoleFunc("DoEvent : " + (a + b));
}
}
class Program
{
static public void ConsoleFunc(string msg)
{
Console.WriteLine("ConsoleFunc : " + msg);
}
static void Main(string[] args)
{
InDelegate id = new InDelegate();
id.myEvent += new delegateEvent(ConsoleFunc);
//id.myEvent += ConsoleFunc; //사용 가능
//id.myEvent = ConsoleFunc; //대입연산자 사용 불가
id.myDelegate = ConsoleFunc;
id.myDelegate("Test"); //클래스 외부 직접 호출 가능
//id.myEvent("Test"); //클래스 외부에서 직접 호출 불가
for(int i = 0; i < 10; i++)
{
id.DoEvent(i + 1, i + 2);
}
}
}
}
728x90
'게임 프로그래밍 > C#' 카테고리의 다른 글
C# LINQ(Select, Oderby, Group, Join) (0) | 2021.12.21 |
---|---|
C# 람다식 Ramdba (0) | 2021.12.21 |
C# 예외 처리(try~catch, exception, throw, finally) (0) | 2021.12.21 |
C# 함수/클래스 일반화(Generic 제네릭) (0) | 2021.12.20 |
C# 컬렉션(ArrayList,Queue,Stack,Hashtable) (0) | 2021.12.20 |