의뢰와 이벤트 (파라미터 이벤트와 파라미터 이벤트 없음)
17939 단어 이벤트
(1) 클래스를 쓸 때 어떤 대상을 호출할 방법을 정할 수 없다. 예를 들어 마이크로소프트의 textbox 이벤트에 자신의 대상을 연결하는 방법이다.마이크로소프트가 textbox를 쓸 때 이 사건이 발생했을 때 어떤 대상을 호출해야 하는지 알 수가 없다. 오직 너 자신이 어떤 방법을 조정해야 하는지 지정하고 의뢰하는 방식으로 해당하는 사건에 걸어야 한다.마이크로소프트가textbox의 이벤트를 쓸 때 유일하게 확실한 것은 이 이벤트의 형식입니다. 또는 이 이벤트가 호출해야 하는 방법의 형식입니다.button1 와 유사합니다.click(object sender, EnentArgse) 등.이 유형에 따라 쓰는 방법이라면 모두 이 사건에 걸릴 수 있고, 사건이 발생할 때 방법이 호출될 수 있다.이것은 단지 메시지 구동에 기초한 실현 방식 중의 하나일 뿐이다.
(2)'입으로 먹는 과정'을 하나의 클래스로 포장한다면 상상해 보세요. 그 중에서 이 동작을 먹는 것에 대해 이렇게 정의합니다. public void 먹기(음식) {음식을 입에 넣는다();//step 1 입에서 움직임(음식);//step 2 삼키기(삼킬 수 있는지);//step 3}
2단계에 주의하라. 음식에 따라 입이 다른 방식으로 처리된다.음식==물, 씹지 않고 음식으로 삼킨다==고기만두, 당연히 씹고 삼켜야 한다=껌, 음식으로만 씹고 삼키지 않는다==생선, 가시를 꼼꼼히 뱉어야 한다.분명히 너는 너의 클래스에서 모든 상황을 예견할 수 없다. 이런 상황에서 '입이 움직이기 시작한다' 는 고려를 의뢰로 정의하여 클라이언트가 호출할 때 구체적으로 실현하도록 할 수 있다. 클래스에서 차지하는 것은 단지 하나의 위치를 차지할 뿐이다.
2. 위탁을 실현하는 절차
1. 의뢰 정의 2.위임 인스턴스 정의 3.방법을 위탁 실례에 등록하다.만약 위탁에 등기 사건이 있으면 실례를 집행한다
두 가지 간단한 예를 들다.
//
public class Test
{
private delegate void CatShoutHandle();
private event CatShoutHandle CatShout;
public void TestDelegate()
{
CatShout += new CatShoutHandle(c_CatShout);
if (CatShout != null)
{
CatShout();
}
}
void c_CatShout()
{
Console.WriteLine("This is my Test Delagate!");
}
static void Main()
{
Test c = new Test();
c.TestDelegate();
return;
}
}
매개변수 상황 있음
//
public class MyParameter:EventArgs
{
private string name;
public MyParameter(string _name)
{
this.name = _name;
}
public string Name
{
get { return name; }
set { name = value; }
}
}
public class Test
{
private delegate void CatShoutHandle(object sender,MyParameter para);
private event CatShoutHandle CatShout;
public void TestDelegate()
{
CatShout += new CatShoutHandle(Test_CatShout);
MyParameter para = new MyParameter("My test Parameter Name");
if (CatShout != null)
{
CatShout(this,para);
}
}
void Test_CatShout(object sender, MyParameter para)
{
Console.WriteLine("This is my Test Delagate! Parameter's name is: {0}",para.Name);
}
static void Main()
{
Test c = new Test();
c.TestDelegate();
return;
}
}
3. 아래의 예는 이벤트를 사용하지 않고 파라미터를 포함하는 의뢰입니다
class clsDelegate
{
public delegate int simpleDelegate(int a, int b);
public int addNumber(int a, int b)
{
return (a + b);
}
public int mulNumber(int a, int b)
{
return (a * b);
}
static void Main(string[] args)
{
clsDelegate clsDlg = new clsDelegate();
simpleDelegate addDelegate = new simpleDelegate(clsDlg.addNumber);
simpleDelegate mulDelegate = new simpleDelegate(clsDlg.mulNumber);
if (addDelegate != null && mulDelegate != null)
{
int addAns = addDelegate(10, 12);
int mulAns = mulDelegate(10, 10);
Console.WriteLine("addNum method using a delegate: {0}", addAns);
Console.WriteLine("mulNum method using a delegate: {0}", mulAns);
Console.Read();
}
}
}
4. 익명 의뢰의 사용
익명 의뢰는 의뢰를 사용하는 또 다른 방식으로 익명 의뢰를 사용할 때 코드가 빨리 실행되지 않는다.컴파일러가 지정한 이름만 있는 방법을 지정했습니다.익명 방법 내부에서 안전하지 않은 코드에 접근할 수 없고, 익명 방법 외부에서ref와out 파라미터를 사용할 수 없습니다.
//
private delegate void TestDelegate2(int a);
public void Eample2()
{
int a = 12;
TestDelegate2 t = delegate(int x)
{
Console.WriteLine("output x : {0}", x);
};
t(a);
}
static void Main()
{
Test c = new Test();
c.Eample2();
return;
}
익명 의뢰 예시 2, 이전 예시와 유사
class Program
{
delegate string delegateTest(string str);
static void Main(string[] args)
{
string second = ",second";
delegateTest test = delegate(string para)
{
para += second;
para += ",third";
return para;
};
Console.WriteLine( test("first"));
}
}
5. 다음은 약간 복잡한 두 가지 예이다
1. 매개 변수 이벤트 없음
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("small cat");
Mouse mouse1 = new Mouse("small mouse1");
Mouse mouse2 = new Mouse("small mouse2");
// Mouse run Cat.CatShoutEventHandlerd CatShout 。
cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
cat.CatShout += new Cat.CatShoutEventHandler(cat_CatShout);
cat.Shout();
Console.ReadLine();
}
static void cat_CatShout()
{
Console.WriteLine("cat is coming ,mouse3 run");
}
}
public class Cat
{
//
public delegate void CatShoutEventHandler();
public event CatShoutEventHandler CatShout;
private string _name;
public Cat(string name)
{
this._name = name;
}
public void Shout()
{
Console.WriteLine("miao, I am {0}", _name);
// CatShout , CatShout()
if (CatShout != null)
CatShout();
}
}
public class Mouse
{
private string _name;
public Mouse(string name)
{
this._name = name;
}
public void Run()
{
Console.WriteLine("Cat is coming, {0} run", _name);
}
}
2. 매개변수 이벤트가 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace weituo
{
class Class1
{
static void Main(string[] args)
{
Cat cat = new Cat("small cat");
Mouse mouse1 = new Mouse("small mouse1");
Mouse mouse2 = new Mouse("small mouse2");
// Mouse run Cat.CatShoutEventHandlerd CatShout 。
cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
cat.CatShout += new Cat.CatShoutEventHandler(cat_CatShout);
cat.Shout();
Console.ReadLine();
}
static void cat_CatShout(object sender, CatShoutEventArgs e)
{
Console.WriteLine("cat is coming ,mouse run");
}
}
public class CatShoutEventArgs : EventArgs
{
private string _name;
public CatShoutEventArgs(string name)
{
this._name = name;
}
public string Name
{
get { return _name; }
set { _name = value; }
}
}
public class Cat
{
//
public delegate void CatShoutEventHandler(object sender, CatShoutEventArgs e);
public event CatShoutEventHandler CatShout;
private string _name;
public Cat(string name)
{
this._name = name;
}
public void Shout()
{
Console.WriteLine("miao, I am {0}", _name);
CatShoutEventArgs e = new CatShoutEventArgs(_name);
// CatShout , CatShout()
if (CatShout != null)
CatShout(this, e);
}
}
public class Mouse
{
private string _name;
public Mouse(string name)
{
this._name = name;
}
public void Run(object sender, CatShoutEventArgs args)
{
Console.WriteLine("Cat {0} is coming, {1} run", args.Name, _name);
}
}
}
3. WPF의 이벤트
3.1 public Window1()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Init);
}
void Init(object sender, RoutedEventArgs e)
{
button2.Click += new RoutedEventHandler(button2_Click);
button3.Click += new RoutedEventHandler(button3Click);
}
void button3Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("testbutton3");
}
void button2_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("testbutton2");
}
3.2 Dispatcher Timer의 사용.지정된 시간 간격과 지정된 우선 순위로 처리되는 Dispatcher 대기열에 통합된 타이머입니다.
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
this.Loaded += delegate
{
//
button2_Click();
timer.Stop();
};
timer.Start();
6. EventHandler 일반 의뢰
class EventHandlerTest
{
public static void TestEventHandler()
{
HasEvent has = new HasEvent();
has.SampleEvent += new EventHandler<MyEventArgs>(has_SampleEvent);
has.EventTest("work smart!");
has.EventTest("work hard!");
}
static void has_SampleEvent(object sender, MyEventArgs e)
{
Console.WriteLine(e.Message);
}
}
public class MyEventArgs:EventArgs
{
private string msg;
public MyEventArgs(string message)
{
msg = message;
}
public string Message
{
get { return msg; }
set { msg = value; }
}
}
public class HasEvent
{
public event EventHandler<MyEventArgs> SampleEvent;
public void EventTest(string str)
{
EventHandler<MyEventArgs> myEvent = SampleEvent;
if (myEvent != null)
{
myEvent(this, new MyEventArgs(str));
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React의 특징 2HTML 태그에 이벤트를 할당하려면 이벤트 이름을 camelCase로 명명하고 이벤트 핸들러에 함수를 전달합니다. style을 할당하는 것은 DOM내에 직접 기술하는 방법이나, CSS프로퍼티를 일단 변수에 대입하고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.