您的位置:首页 > 编程语言 > C#

c#中的委托与事件

2011-10-14 17:27 141 查看
C#委托与事件

一、委托

关键字:delegate 委托是C#中的一种类型,它实际上是一个对某个方法引用的类

委托是一种引用方法类型 一旦为委托分配了方法 委托将与该方法有相同完全的行为(委托具有参数 和返回值)

delegate类能拥有一个签名(signature);

只能持有与他签名相匹配的方法的引用;

委托实际上是封装了一个函数的引用对象;

类似于c.c++中的函数指针;

使用方法:

1、声明一个delegate 对象类型

public delegate void MyDelegate(string name);

2、创建delegate对象

MyDelegate md=new MyDelegate(methodname);//指向方法名称
3、调用delegate对象
private string methodname(string name)
{
console.writeline("hell0"+name);
}
md("jack");
也许到这里大家会想 这就是绕了个圈 执行函数 那我们就看看真正他的好处在哪里吧

引用的例子:
public void drive(string carname)
{
drivemoto(carname);
}

public void drivemoto(string carname)
{
Console.WriteLine(carname+"moto is driving!");
}
这个就是一个简单的开车的方法 没有实际意义 当我们

如果是开的是汽车或者自行车的时候 我们希望也能对应的方法

那么我们就得定义
public void drivecar(string carname);
public void drivebic(string carname);
但是我们扩展的时候 性能很差 也不符合传说中面相对象的原则

我们可以通过委托来传递方法签名
	public delegate void MyDelegate(string name);
public void drive(string carname,MyDelegate funcname)
{
funcname(carname);
}

ok 当我们调用 drive函数的时候直接就可以
drive(moto,drivemoto)

drive(moto,drivecar);
好,现在有点意思了,其实委托在简单的程序中并不是有多大的作用,

但是.net事件、异步调用、 以及自定义事件 等等都是用到委托的

委托应用在在传递匿名方法上,这种动态的将方法赋给参数 减少了

程序中使用判断语句的次数

二、事件

事件就是某个对象发出的消息

除非事件的对象 (sender) 做出相应的对象(receiver)

c#中的事件就是有一个特殊签名的delegate委托(event)
//定义委托
public delegate void driveCarEventHandler();	//定义事件(声明一个特殊的委托对象)
public class Car
{
public event driveCarEventHandler driveCarEvent;//定义事件(声明一个特殊的委托对象)
public void drivecar()
{
if(driveCarEvent!=null)

{
driveCarEvent();
}
}
}

//调用方法

Car car=new Car();

car.driveCarEvent+=new driveCarEventHandler(car_drivevent);

car.drivecar();

static void car_drivevent()
{
Console.WriteLine("Car is Driving!!");
}
订阅事件用+= 取消订阅用-= 可以进行多播订阅(委托亦可以 不过第一次指定时候用= 余下来用+=)

总结:

委托就是委任别人去代办某些问题和方法,尽量的使业务和逻辑之间松耦合 来达到对逻辑的封装以及调用。

说的简单一点就是函数的实例化,我们对实例进行操作

事件是特殊的委托类型,对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,

也可能是由某些其他的程序逻辑触发的。

委托和事件 这是我个人的一些理解,也参考了网上的例子自己进行学习和感悟 希望能够分享小小的心得 共同进步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: