c# 事件與委托
委托
委托是一個可以參考方法的物件,當創建一個委托時也就創建了一個參考方法物件(可以參考其他方法),
呼叫委托時,委托會呼叫它指向的方法,

1.創建委托(與類相同):委托的形參要與對應方法的形參相同
有輸入引數:
public delegate void MYDelegate1(String s);
無輸入引數:
public delegate void MYDelegate2();
2.創建需要委托的方法
class C{
public double dMethod1(String s){
Console.WriteLine("有輸入引數的方法");
retuen 10.2;
}
public void dMethod2(){
Console.WriteLine("無輸入引數的方法");
}
public void dMethod3(){
Console.WriteLine("無輸入引數的方法");
}
}
3. 將方法傳入委托
C c=new C();
MYDelegate1 d1=new MYDelegate1(c.dMethod1);
MYDelegate2 d2=new MYDelegate1(c.dMethod2);
d2+=new MYDelegate1(c.dMethod3);//委托串列
4. 使用委托
MYDelegate1("123");
MYDelegate2();//按順序先呼叫dMethod1后呼叫dMethod2
事件
事件是特殊化的委托,委托是事件的基礎,
事件相當于委托的一個實體,
1.創建委托(與類相同):委托的形參要與對應方法的形參相同
有輸入引數:
public delegate void MYDelegate1(String s);
無輸入引數:
public delegate void MYDelegate2();
2.事件的宣告
class E{
public event MYDelegate2 event0;//事件的宣告與創建
}
3.創建需要委托的方法
class C{
public double dMethod1(String s){
Console.WriteLine("有輸入引數的方法");
retuen 10.2;
}
public void dMethod2(){
Console.WriteLine("無輸入引數的方法");
}
public void dMethod3(){
Console.WriteLine("無輸入引數的方法");
}
}
4. 事件的預訂與取消
C c=new C();
E e=new E();
/* 在事件的類外面不可以使用=賦值,只能用+=與-=
* e.event0=new MYDelegate1(c.dMethod2);
*/
e.event0+=new MYDelegate1(c.dMethod2);//事件的預訂
e.event0+=new MYDelegate1(c.dMethod3);//事件的預訂
e.event0-=new MYDelegate1(c.dMethod3);//事件的取消
5. 使用事件
e.event0();
實體:
using System;
namespace DelegateAndEvent
{
//定義一個事件類
public class MyEvent
{
//定義一個委托
public delegate void MyDelegate();
//定義一個事件
public MyDelegate MyDelegateEvent;
//定義一個觸發事件的函式
public void OnMyDelegateEvent()
{
//判斷事件是否非空
if (MyDelegateEvent != null)
{
//執行事件
MyDelegateEvent();
}
//MyDelegateEvent?.Invoke(); //簡化的判斷和執行
}
}
class Program
{
//輸出一串字符
public static void putOutChar()
{
Console.WriteLine("I was fired");
}
//輸出第二串字符
public static void putOutChar2()
{
Console.WriteLine("I was fired22222");
}
static void Main(string[] args)
{
//實體化MyEvent2類
MyEvent myEvent = new MyEvent();
//注冊一個事件
myEvent.MyDelegateEvent += new MyEvent.MyDelegate(putOutChar);
myEvent.MyDelegateEvent += new MyEvent.MyDelegate(putOutChar2);
//執行觸發事件的函式
Console.WriteLine("執行系結了兩個事件后的函式");
myEvent.OnMyDelegateEvent();
//解綁一個事件
myEvent.MyDelegateEvent -= new MyEvent.MyDelegate(putOutChar);
//再次執行觸發事件的函式
Console.WriteLine("執行解綁了一個事件后的函式");
myEvent.OnMyDelegateEvent();
Console.ReadKey();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504061.html
標籤:C#
下一篇:java.lang.NoClassDefFoundError:sun/reflect/Reflection從jar運行時
