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();
}
}
}
相关文章
- Python中的函数与方法 以及Bound Method和Unbound Method
- 一文贯通python文件读取
- Python 中的异步编程:Asyncio
- 7个你现在就该学习Python的理由
- 提高Python运行效率的六个窍门
- Python数据科学:神经网络
- 一篇文章看懂大数据分析就业前景及职能定位
- R和Python中的文本挖掘:8个入门小贴士
- 告诉你为什么Python有点慢,但我却无所谓?
- 专注学习DevOps编程语言Top 5推荐
- Python发送邮件脚本
- Python多进程并行编程实践: mpi4py 的使用
- Python语言在未来的发展前景
- Python vs Ruby: 谁是最好的 web 开发语言?
- Python对Ruby:谁在Web开发领域更胜一筹?
- Python一行代码完成并行任务
- Python开发者2017应该关注的七个类库
- python爬虫入门基本知识
- 在终端中优雅地编写Python
- Python机器学习实战:信用卡欺诈检测