// C#
// delegate 생성
delegate void DelegateTest(int a, int b);
// Sum 함수 구현
static void Sum(int a, int b)
{
Console.WirteLine("a + b = " + (a + n));
}
// 기본 선언
DelegateTest delegate1 = new DelegateTest(Sum);
// 간락햔 선언
DelegateTest delegate2 = Sum;
// 익명 함수로 선언
DelegateTest delegate3 = delegate(int a, int b)
{
Console.WirteLine("a + b = " + (a + b));
};
// 람다식 선언
DelegateTest delegate4 = (a, b)
{
Console.WirteLine("a + b = " + (a + b));
};
// C#
// 반환형 void, 파라미터 없는 delegate 생성
delegate void delegateFunc();
class MessageProcess
{
// delegate 선언
delegateFunc OkFunc;
delegateFunc CancelFunc;
// 파라미터로 delegate 메소드를 받음
public void ShowMessage(string msg, delegateFunc okFunc, delegateFunc cancelFunc)
{
OkFunc = okFunc;
CancelFunc = cancelFunc;
Console.WriteLine("Message : " + msg + " (0 : OK, else : Cancel)");
string inputStr = Console.ReadLine();
if (inputStr.Equals("0"))
{
OkFunc();
}
else
{
CancelFunc();
}
}
}
class Program
{
static void CallOK()
{
Console.WriteLine("Call OK");
}
static void CallCancel()
{
Console.WriteLine("Call Cancel");
}
static void Main(string[] args)
{
MessageProcess msg = new MessageProcess();
msg.ShowMessage("Test Message", CallOK, CallCancel);
// 파라미터에 익명 함수로 구현과 전달을 한번에
msg.ShowMessage("Test Message",
delegate ()
{
Console.WriteLine("Call InDelegate");
}
, CallCancel);
}
}
// C#
delegate void ShowMessage();
class Message
{
public void FirstMessage()
{
Console.WriteLine("First Message");
}
public void SecondMessage()
{
Console.WriteLine("Second Message");
}
pubilc void Main()
{
ShowMessage message = new ShowMessage(FirstMessage);
message += SecondMessage; // 하나 더 참조
message(); // 두 메서드 모두 호출
// += 연산자를 이용하여 여러 메서드를 참조할 수 있다.
// -= 연산자를 사용하여 메서드 참조를 제외할 수 있다.
}
}
// C#
delegate void delegateEvent(string message);
class InDelegate
{
public delegateEvent myDelegate; // delegate 선언
public event delegateEvent myEvent; // event 선언
public void DoEvent(int a, int b)
{
if (myEvent != null)
{
myEvent("Event : " + (a + b));
}
}
}
class Program
{
static public void ConsoleFunc(string message)
{
Console.WriteLine("ConsoleFunc : " + message);
}
static void Main(string[] args)
{
InDelegate id = new InDelegate(); // InDelegate 객체 생성
// id.myEvent += new delegateEvent(ConsoleFunc); // id 객체 안에 있는 myEvent에 ConsoleFunc 메소드를 참조
id.myEvent += ConsoleFunc; // id 객체 안에 있는 myEvent에 ConsoleFunc 메소드를 참조
// id.myEvent = ConsoleFunc; // event는 할당 연산자 사용 불가
// id.myEvent("test"); // event는 클래스 외부에서 직접 호출 불가능
// id.myDelegate = ConsoleFunc; // delegate는 할당 연산자 사용 가능
// id.myDelegate("test"); // delegate는 클래스 외부에서 직접호출 가능
for (int i = 0; i < 10; i++)
{
if (i == 9)
{
// i가 9일 때 ConsoleFunc를 제외
id.myEvent -= ConsoleFunc;
}
id.DoEvent(i + 1, i + 2);
}
}
}