博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中的委托和事件
阅读量:5896 次
发布时间:2019-06-19

本文共 2585 字,大约阅读时间需要 8 分钟。

1 委托

委托是寻址方法的.NET版本。它在功能上与C++中的函数指针类似,但是函数指针不是类型安全的,因为无法判断这个指针实际上是指向什么,参数和返回类型也不知道。而委托则是类型安全的类,它定义了返回类型和参数的类型。委托类既可以引用一个方法,也可以引用多个方法。

 

我们用书上的一个例子来看如何使用委托。

先是定义一个类MathOperations,它有两个静态方法,对double类型的值执行两个操作。

using System;namespace LearnDelegate{	public class MathOperations	{		public MathOperations ()		{		}		public static double MultiplyByTwo(double value)		{			return value * 2;		}		public static double Square(double value)		{			return value * value;		}	}}

然后使用委托调用这些方法。

using System;namespace LearnDelegate{	delegate double DoubleOp(double x);	class MainClass	{		public static void Main (string[] args)		{			Console.WriteLine ("Learn Delegate!");			DoubleOp[] operations = {				MathOperations.MultiplyByTwo,				MathOperations.Square			};			for(int i=0;i

运行结果如下:

2 事件

事件基于委托,为委托提供了一种发布/订阅机制。

 

2.1 事件发布程序

从CarDealer类开始,它基于事件提供一个订阅。CarDealer类用event关键字定义了类型为EventHandler<CarInfoEventArgs> 的NewInfo事件。在NewCar()中,通过调用RaiseNewCarInfo方法触发NewCarInfo事件。这个方法实现了检查委托是否为空,如果不为空,就引发事件。

using System;namespace LearnEvent{	public class CarInfoEventArgs: EventArgs	{		public CarInfoEventArgs (string car)		{			this.Car = car;		}		public string Car{ get; private set;}	}	public class CarDealer	{		public event EventHandler
NewCarInfo; public void NewCar(string car) { Console.WriteLine("CarDealer, new car {0}", car); RaiseNewCarInfo(car); } protected virtual void RaiseNewCarInfo(string car) { EventHandler
newCarInfo = NewCarInfo; if (newCarInfo != null) { newCarInfo (this, new CarInfoEventArgs(car)); } } }}

2.2 事件侦听器

Consumer类用作事件侦听器。这个类订阅了CarDealer类的事件,并且定义了NewCarIsHere方法,该方法满足EventHandler<CarInfoEventArgs>委托的要求,参数类型是object和CarInfoEventArgs。

using System;namespace LearnEvent{	public class Consumer	{		private string name;		public Consumer (string name)		{			this.name = name;		}		public void NewCarIsHere(object sender, CarInfoEventArgs e)		{			Console.WriteLine ("{0}: car {1} is new",name,e.Car);		}	}}

3 事件的使用

现在来连接事件发布程序和订阅器。

using System;namespace LearnEvent{	class MainClass	{		public static void Main (string[] args)		{			//Console.WriteLine ("Hello World!");			var dealer = new CarDealer();			var michael = new Consumer ("Michael");			dealer.NewCarInfo += michael.NewCarIsHere;			dealer.NewCar ("MAZDA");			Console.WriteLine ();			var sebastian = new Consumer ("Sebastian");			dealer.NewCarInfo += sebastian.NewCarIsHere;			dealer.NewCar ("BMW");			Console.WriteLine ();			dealer.NewCarInfo -= michael.NewCarIsHere;			dealer.NewCar ("Benz");			Console.WriteLine ();		}	}}

运行结果如下:

转载于:https://www.cnblogs.com/yanhuiqingkong/p/7770051.html

你可能感兴趣的文章
java socket参数详解:TcpNoDelay降低通信延迟
查看>>
awk学习笔记
查看>>
加密、解密和私用CA搭建
查看>>
对MyIsam存储引擎表损坏的处理
查看>>
批量执行工具PSSH详解
查看>>
Netfilter和Netgraph
查看>>
HiPAC高性能规则匹配算法之查找过程
查看>>
Saltstack批量部署tomcat(多实例)
查看>>
通配符、正则表达式的记录
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
HSRP 详解与配置
查看>>
pgrouting源码安装说明
查看>>
中国红盟召集所有成员归队
查看>>
那些你知道的和你不知道的win7快捷键(五)
查看>>
Linux(centos6)环境zabbix 3.4邮件报警配置及zabbix故障处理
查看>>
yum锁定强行解锁
查看>>
静态路由
查看>>
Spark官方文档: Spark Configuration(Spark配置)
查看>>
yum 6.8 nginx php-fpm
查看>>