C#高级语法---委托、事件
作者:
也许
,
2022-07-25 16:04:42
,
所有人可见
,
阅读 296
委托:C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针,是一个变量
委托语法
public delegate int MyDelegate (string s);
public delegate void printString(string s);
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);
委托特性:多播
委托对象可使用 "+" 运算符进行合并
委托对象可使用 "-" 运算符进行去除
只有相同类型的委托可被合并或去除
可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting)
委托作用:
回调---实现与定义解耦合,委托做函数参数
关联事件和事件处理程序,见下文
事件
两个概念:事件与事件处理程序
事件:相当与一个用户操作,如点击按钮,选中图片等。也可以是属性
事件处理程序:应用程序需要在事件发生时响应事件,这个相应动作称为事件处理程序
事件与事件处理程序通过委托建立关联,语法中体现
声明事件:在委托前加了evevt关键字
本质是用来对委托类型的变量进行封装,事件有有委托的多播特性,可以注册事件处理程序
public delegate void BoilerLogHandler(string status);
public event BoilerLogHandler BoilerEventLog;
string msg;
BoilerEventLog(msg)
BoilerEventLog += new BoilerLogHandler(print)
使用自定义事件步骤:
1:定义delegate对象类型,他有两个参数,第一个参数是事件发送者对象,第二个参数是事件参数类对象。
2:定义事件参数类,此类应当从system.eventargs类派生。如果事件不带参数,这一步能省略。
3:定义事件处理方法,他应当和delegate对象具有相同的参数和返回值类型。
4:用event关键字定义事件对象,他同时也是个delegate对象。
5:用+=操作符添加事件到事件队列中(-=操作符能够将事件从队列中删除)。
6:在需要触发事件的地方用调用delegate的方式写事件触发方法。一般来说,此方法应为protected访问限制,既不能
以public方式调用,但能被子类继承。名字是能是oneventname。
7:在适当的地方调用事件触发方法触发事件
事件的应用:
线程间通信
模块解耦合
主窗体生成一个子窗体,子窗体某些操作可以改变主窗体的控件显示,
强耦合:主窗体把自身指针传给子窗体,子窗体通过this指针改变主窗体
松耦合:子窗体通过事件发布触发,主窗体订阅事件