//델리게이트 & 이벤트
//메서드의 대리자
//메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캡슐화 할수
있게 만들어 주는 방법
//델리게이트를 사용하려면 어떤 메서드를 호출할 것인지 컴파일할 시점이 아닌 프로그램을 실행하는 런타임 상황에서
결정할 수 있다.
//1단계 - Delegate할 메서드 정의
using System;
class
Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
//2단계 - Method에 맞는 Delegate 선언
using
System;
delegate void SimpleDelegate1(); // Delegate 선언1 --> void
F1()
delegate void SimpleDelegate2(); // Delegate 선언2 --> void
F2()
class Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
//3단계 - 임의의 객체 생성
//Delegate할 Method를 정하고 Delegate를 선언했다면, 이제 Method가 포함된
Class의 객체를 만들어야 한다. 그래야 특정 객체의 메서드가 하나의 독립적인 Delegate로서 활동 할수 있다.
using System;
delegate void SimpleDelegate1(); // Delegate 선언1
--> void F1()
delegate void SimpleDelegate2(int i); // Delegate 선언2 -->
void F2()
class Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
class DeleTest
{
public static void
Main()
{
Atype atype = new Atype(); // 객체(Instance)
생성
}
}
//4단계 - Delegate 생성과 호출
using System;
delegate void
SimpleDelegate1(); // Delegate 선언1 --> void F1()
delegate void
SimpleDelegate2(int i); // Delegate 선언2 --> void F2()
class
Atype
{
public void F1() //Delegate 할
Method1
{
Console.WriteLine("Atype.F1");
}
public void F2(int
x) //Delegate 할 Method2
{
Console.WriteLine("Atype.F2
=x"+x);
}
}
class DeleTest
{
public static void
Main()
{
Atype atype = new Atype(); // 객체(Instance)
생성
SimpleDelegate1 s1 = new SimpleDelegate1(atype.F1); //Delegate
생성
SimpleDelegate2 s2 = new SimpleDelegate2(atype.F2); //Delegate
생성
s1(); //Delegate를 이용한 호출1
s2(1000); // Delegate를 이용한
호출2
}
}
//메소드 호출 : 일반 메소드 & 인스턴스 메소드
using
System;
namespace delegateEX
{
public delegate void MyDelegate(int x);
//델리게이트 선언
class MyClass
{
public static void Test(int
x)
{
Console.WriteLine("Test 메서드의 x 값은 : {0}",x);
}
public
static void Test2(int x)
{
Console.WriteLine("Test2 메서드의 x 값은 :
{0}",x);
}
class Class1
{
[STAThread]
static void
Main(string[] args)
{
MyClass.Test(100); //일반 메소드 호출
형식
//Test델리게이트 Instance
생성
MyDelegate MD = new MyDelegate(MyClass.Test);
MD(100); //
델리게이트를 통한 호출
MD = new
MyDelegate(MyClass.Test2);
MD(200);
}
}
}
}
//하나의 Delegate에 여러개의 Delegate등록
using System;
delegate void TopDelegator(string str);
//Delegate Declare
class Top
{
public static void StaticMethod(string
str)
{
Console.WriteLine("static Method
\t");
Console.WriteLine(str);
}
public void NormalMethod(string
str)
{
Console.WriteLine("Normal Method
\t");
Console.WriteLine(str);
}
}
class
MultiDelegateTest
{
public static void Main()
{
Top t = new
Top(); //클래스 인스턴스화
TopDelegator bank;
TopDelegator td1 = new
TopDelegator(t.NormalMethod); // 델리게이트 인스턴스화
TopDelegator td2 = new
TopDelegator(Top.StaticMethod); // 델리게이트 인스턴스화
bank = td1;
bank("add TopDelegator
1"); // 하나의 delegate 호출
bank += td2;
bank("add TopDelegator 2");
// 두개의 delegate 호출
bank -= td1;
bank("remove topDelegator
1"); // Delegate 제거
}
}
using System;
namespace DelegateEX
{
public delegate void MyDelegate(string
message);//Delegate 선언
class MyClass
{
public string message; //string 변수선언
public void Process(MyDelegate mydelegate) // 공용 메소드
선언
{
mydelegate(message);//선언한 string 변수 삽입
}
}
class Class1
{
public static void DisplayMessage1(string
message)
{
Console.WriteLine("DisplayMessage1 : {0}",
message);
}
public void DisplayMessage2(string
message)
{
Console.WriteLine("DisplayMessage2 :
{0}",message);
}
[STAThread]
static void Main(string[] args)
{
MyClass mc =
new MyClass(); // 초기화
mc.message ="cookee";
MyDelegate md1 = new
MyDelegate(DisplayMessage1);
mc.Process(md1);
mc.message = "cookee2";
MyDelegate md2 = new MyDelegate(new
Class1().DisplayMessage2);
mc.Process(md2);
}
}
}
using System;
namespace DelegateEX
{
public
delegate int MyDelegate(int i, string s);//반환값이 Int, string 매개변수가 두개인 델리게이트
선언.
class Class1
{
public
MyDelegate my; //MyDelegate형 my 선언.
public int Hello(int i,string s) // my가 호출되었을때 실행할 메소드
작성
{
Console.WriteLine("Hello MyDelegate my -- {0}",s);
return
i;
}
[STAThread]
static void Main(string[] args)
{
Class1 cs =
new Class1();//초기화..
cs.my = new MyDelegate(cs.Hello);//my변수에 처리할 메소드 Hello
할당.
int i = cs.my(2,"cookee"); // 델리게이트형 변수 my
실행.
Console.WriteLine(i);
}
}
}
using System;
namespace DelegateEX
{
public delegate void MyDelegate();//void 이고 인자가
없는 delegate 선언.
class Class1 //서로다른 클래스 : Class1
{
public event MyDelegate my;
//MyDelegate형 my 선언(my는 이벤트 변수가 된다.) event 키워드 붙인다.
public void Hello() // my가 실행할 메소드 작성
{
Console.WriteLine("다른
클래스에서 인자없고 반환없는 델리게이트 실행한 결과");
}
public void TriggerEvent() //이벤트 받는 메소드
{
this.my(); //이벤트 메소드
내에서 Event my()실행.
}
}
class execute //서로다른 메인클래스
{
[STAThread]
static void
Main(string[] args)
{
Class1 cs = new Class1();//초기화..
cs.my += new MyDelegate(cs.Hello);//델리게이트변수 my가 처리할 메소드 Hello를
할당.
cs.TriggerEvent(); //이벤트를 받을 메소드 부름.
}
}
}
//=========================== 1 =========================================================
using System;
namespace DelegateEX
{
public delegate void MyEventHandler2(string s);
//델리게이트 선언
class myButton2
{
public event MyEventHandler2 Event; // delegate형
이벤트 등록.
public void button2_Click(string
val)
{
Console.WriteLine("{0} : 버튼에서 이벤트 발생
:",val);
}
public void button3_Click(string
val)
{
Console.WriteLine("{0} : 버튼에서 또 이벤트 발생
:",val);
}
static void Main(string[] args)
{
myButton2 ok =
new myButton2();
//이벤트 발생
ok.Event += new MyEventHandler2(ok.button2_Click);
//이벤트 추가
ok.Event += new
MyEventHandler2(ok.button3_Click);
ok.Event("cookee");
}
}
}
Delegate - 8. 윈폼띄우기
using System;
using
System.Drawing;//솔루션탐색기에서 참조추가 해준다.
using System.Windows.Forms;//마찬가지로 참조추가
해준다.
namespace DelegateEX
{
public class EventCall
{
public static
void Hello(object
sender, EventArgs e)
{
Console.WriteLine("Hello 메소드
실행!!");
}
public static void cookee(object sender, EventArgs e)
{
int x =
100, y=100;
Console.WriteLine("cookee");
Form frm1 = new Form();
Button btn2 = new Button();
btn2.Text = "버튼2";
x = x + btn2.Location.X;
y = y + btn2.Location.Y;
btn2.Location = new
Point(x,y);
frm1.Controls.Add(btn2);
frm1.Show();
Console.WriteLine("cookee매소드 실행!!");
}
public static void Main(string[] args)
{
Form f = new
Form();
Button btn = new Button();
//버튼 속성
지정
btn.Text = "버튼을 누르면 Hello 메소드실행! ";
btn.Location = new
Point(100,100); // point 구조체의 생성자에 할당.
btn.Size = new Size(200,30);//size
구조체의 생성자에 할당.
btn.ForeColor = Color.Black;
btn.BackColor =
Color.Red;
f.Controls.Add(btn);
btn.Click += new EventHandler(Hello);
Button btn1 = new Button();
btn1.Text = "버튼위에 마우스커서를 올려놓으면 cookee
메소드실행 ";
btn1.Size = new Size(180,50);
btn1.BackColor =
Color.Yellow;
btn.Location = new
Point(50,100);
f.Controls.Add(btn1);
btn1.MouseHover += new
EventHandler(cookee);//버튼위에 올려놓으면 새로운 Form이 뜬다.
Application.Run(f);
}
}
}
[출처] Delegate 의 사용|작성자 니시오카
'Program > C#' 카테고리의 다른 글
시스템 사양 알아내기~ (0) | 2010.03.07 |
---|---|
Delegate 사용 2 (0) | 2010.03.07 |
[ASP.NET] Referrer 속성으로 사이트 방문시 유입 경로 알아내기 (0) | 2010.03.05 |
주사위놀이 (0) | 2010.02.09 |
Silent Install of MS .Net Framework Version 2 (0) | 2010.02.05 |