zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#中委托和事件的区别实例解析

c#实例事件 解析 区别 委托
2023-06-13 09:15:45 时间

本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。

一、通过委托执行方法

classProgram
{
staticvoidMain(string[]args)
{
Exampleexample=newExample();
example.Go();
Console.ReadKey();
}
}
publicclassExample
{
publicdelegatevoidDoSth(stringstr);
internalvoidGo()
{
//声明一个委托变量,并把已知方法作为其构造函数的参数
DoSthd=newDoSth(Print);
stringstr="Hello,World";
//通过委托的静态方法Invoke触发委托
d.Invoke(str);
}
voidPrint(stringstr)
{
Console.WriteLine(str);
}
}

上述代码实现:

①在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。
②委托DoSth定义了方法的参数和返回类型
③通过委托DoSth的构造函数,可以把符合定义的方法赋值给委托
④调用委托的实例方法Invoke执行了方法

但实际上让委托执行方法还有另外一种方式,那就是:委托变量(参数列表)

publicclassExample
{
publicdelegatevoidDoSth(objectsender,EventArgse);
internalvoidGo()
{
//声明一个委托变量,并把已知方法作为其构造函数的参数
DoSthd=newDoSth(Print);
objectsender=10;
EventArgse=newEventArgs();
d(sender,e);
}
voidPrint(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
}

上述代码实现:

①委托DoSth的参数列表和方法Print的参数列表还是保持一致
②委托DoSth中的参数objectsender通常用来表示动作的发起者,EventArgse用来表示动作所带的参数。

而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。

二、通过事件执行方法

publicclassExample
{
publicdelegatevoidDoSth(objectsender,EventArgse);
publiceventDoSthmyDoSth;
internalvoidGo()
{
//声明一个委托变量,并把已知方法作为其构造函数的参数
DoSthd=newDoSth(Print);
objectsender=10;
EventArgse=newEventArgs();
myDoSth+=newDoSth(d);
myDoSth(sender,e);
}
voidPrint(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
}

上述代码实现:

①声明了事件myDoSth,事件的类型是DoSth这个委托
②通过+=为事件注册委托
③通过DoSth委托的构造函数为事件注册委托实例
④采用委托变量(参数列表)这种形式,让事件执行方法

而且,通过+=还可以为事件注册多个委托。

publicclassExample
{
publicdelegatevoidDoSth(objectsender,EventArgse);
publiceventDoSthmyDoSth;
internalvoidGo()
{
//声明一个委托变量,并把已知方法作为其构造函数的参数
DoSthd=newDoSth(Print);
DoSthd1=newDoSth(Say);
objectsender=10;
EventArgse=newEventArgs();
//为事件注册多个委托
myDoSth+=newDoSth(d);
myDoSth+=newDoSth(d1);
myDoSth(sender,e);
}
voidPrint(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
voidSay(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
}

以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。

publicclassExample
{
publicdelegatevoidDoSth(objectsender,EventArgse);
publiceventDoSthmyDoSth;
internalvoidGo()
{
objectsender=10;
EventArgse=newEventArgs();
//为事件注册多个委托
myDoSth+=Print;
myDoSth+=Say;
myDoSth(sender,e);
}
voidPrint(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
voidSay(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
}

三、通过EventHandler执行方法

先来看EventHandler的源代码。

publicdelegatevoidEventHandler(objectsender,System.EventArgse);

可见,EventHandler就是委托。现在就使用EventHandler来执行多个方法。

publicclassExample
{
publiceventEventHandlermyEvent;
internalvoidGo()
{
objectsender=10;
EventArgse=newEventArgs();
//为事件注册多个委托
myEvent+=Print;
myEvent+=Say;
myEvent(sender,e);
}
voidPrint(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
voidSay(objectsender,EventArgse)
{
Console.WriteLine(sender);
}
}

总结:

①委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例
②触发委托有2种方式:委托实例.Invoke(参数列表),委托实例(参数列表)
③事件可以看作是一个委托类型的变量
④通过+=为事件注册多个委托实例或多个方法
⑤通过-=为事件注销多个委托实例或多个方法
⑥EventHandler就是一个委托

相信本文所述对大家C#程序设计的学习有一定的借鉴价值。