事件

事 件 事件


事件就是委托的再一层封装,屏蔽了一些不常用的和危险的API操作等等,其实事件就是委托


myClass.MyEvent += new MyDelegate(EventFunction);//通过委托将方法和事件绑定
看到事件和委托可以通过 += 进行赋值,就能隐约感觉到


1.通过委托将方法和事件绑定

myClass.MyEvent += new MyDelegate(EventFunction);//通过委托将方法和事件绑定
  1. EventFunction:方法
  2. MyDelegate:委托
  3. MyEvent :事件

2.绑定之后使用,即触发事件。

事件触发后,该事件绑定的方法将被调用

myClass.Fire("ab",1);
public void Fire(string s,int i){
		if (MyEvent != null)
		{
			MyEvent(s, i);//触发事件,事件触发后,该事件绑定的方法将被调用
		}
}

1)一定要理解事件的含义;
2)注意自定义事件的使用方法;
3)开发过程中我们会经常用到别人已经定义好的事件,很少自己去定义事件。


事件基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。

应用程序需要在事件发生时响应事件。

类或对象可以通过事件向其他类或对象通知发生的相关事情。

发送(或引发)事件的类称为“发行者(publisher) "

接收(或处理)事件的类称为订阅者(subscriber)"

public class MyClass{
	public event MyDelegate MyEvent;

}

在声明事件之前首先必须声明该事件的委托类型(代理)

public delegate void MyDelegate(string s,int i) ;

基于上面的委托声明一个事件

public class MyClass{
	public event MyDelegate MyEvent;

}

触发事件,事件触发后,该事件绑定的方法将被调用


public class MyClass{
	public event MyDelegate MyEvent;

	public void Fire(string s,int i){
			if (MyEvent != null)
			{
				MyEvent(s, i);//触发事件,事件触发后,该事件绑定的方法将被调用
			}
	}

}

创建一个事件处理方法

private void EventFunction(string s,int i)
{
	Console.WriteLine("事件被触发,我是对应的处理函数");
}

使用

private void btnEvent_Click(object sender,EventArgs e)
{
	MyClass myClass = new MyClass();
	myClass.MyEvent += new MyDelegate(EventFunction);//通过委托将方法和事件绑定
	myClass.Fire("ab",1);

}

在这里插入图片描述


1.回调

事件与委托,是一种回调机制的设计

类似于Qt中信号和槽函数的机制

委托的本质就是回调函数


利用委托来实现回调机制演示:

1 ColorBox:模拟一个颜色选择控件
2注册回调处理方法
3当用户选择一个颜色后,触发回调

注意:其实委托的本质,就是回调函数


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp基础语法
{
    class ColorBox
    {
        private string[] options =
        {
            "white","red","green","blue","black"
        };
        public delegate void ChangeHandler(string color);

        // 定义回调
        public ChangeHandler handler;

        // 模拟用户选择
        public void UserSelect(int index)
        {
            string color = options[index];
            if (handler != null)
            {
                handler.Invoke(color);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp基础语法
{


    class Program
    {
        static void OnColorChanged(string color)
        {
            Console.WriteLine("使用颜色:" + color);
        }
        static void Main(string[] args)
        {
            ColorBox box = new ColorBox();

            // 注册回调
            box.handler = new ColorBox.ChangeHandler(Program.OnColorChanged);

            // 用户点击
            box.UserSelect(0);

       

        }
    }
}


这种回调的设计,只能注册一个回调方法
如果要注册多个回调方法,就需要用一个List来实现,形式上有一点啰嗦。

public List<ChangeHandler> handlerList;

2.事件 event

用事件event来实现回调机制:修改以下两处;
1定义事件

public event ChangeHandler Handlers;

2注册回调

box.Handlers  += new ColorBox.ChangeHandler(Program.OnColorChanged);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp基础语法
{
    class ColorBox
    {
        private string[] options =
        {
            "white","red","green","blue","black"
        };
        public delegate void ChangeHandler(string color);

        // 定义回调
        public event  ChangeHandler handler;

        // 模拟用户选择
        public void UserSelect(int index)
        {
            string color = options[index];
            if (handler != null)
            {
                handler.Invoke(color);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharp基础语法
{


    class Program
    {
        static void OnColorChanged(string color)
        {
            Console.WriteLine("使用颜色:" + color);
        }
        static void Main(string[] args)
        {
            ColorBox box = new ColorBox();

            // 注册回调
            box.handler += new ColorBox.ChangeHandler(Program.OnColorChanged);

            // 用户点击
            box.UserSelect(0);

       

        }
    }
}


在这里插入图片描述

event倒底是个什么东西?
可以认为是一种特殊的写法,相当于:

List<ChangeHandler> Handlers

里面可以存储多个回调方法。
使用Handlers += xxx就可以向里面添加多个回调


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp4learning1
{
    class Program
    {

        static void OnColorChanged(string color)
        {
            Console.WriteLine("使用颜色" + color);
        }

        static void OnColorChanged2(string color)
        {
            Console.WriteLine("你好" + color);
        }

        static void Main(string[] args)
        {
            ColorBox box = new ColorBox();
            box.Handlers += new ColorBox.ChangeHandler(Program.OnColorChanged);
            box.Handlers += new ColorBox.ChangeHandler(Program.OnColorChanged2);

            box.UserSelect(1);
            Console.ReadLine();
            
        }
    }
}

注意

Event,它封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。

在类的外部,注册"+=“和注销”-="的访问与你在声明事件时使用的访问符相同。声明一个事件类似于声明一个进行了封装的委托类型的变量而已,使委托绑定方法更方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值