zl程序教程

您现在的位置是:首页 >  Python

当前栏目

c# 事件与委托

2023-03-31 10:59:15 时间

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();
        }
    }
}