事 件 事件 事件
事件就是委托的再一层封装,屏蔽了一些不常用的和危险的API操作等等,其实事件就是委托
myClass.MyEvent += new MyDelegate(EventFunction);//通过委托将方法和事件绑定
看到事件和委托可以通过 += 进行赋值,就能隐约感觉到
1.通过委托将方法和事件绑定
myClass.MyEvent += new MyDelegate(EventFunction);//通过委托将方法和事件绑定
- EventFunction:方法
- MyDelegate:委托
- 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();
}
}
}