Set*_*man 12 .net c# vb.net delegates event-handling
在过去的几天里,我问了几个关于代表在这里和这里的问题.我承认......我真的不了解代表们.而且我真的非常想要理解并掌握它们.(我可以定义它们 - 类型安全函数指针 - 但由于我对C类型语言没什么经验,所以它实际上并没有用.)
任何人都可以推荐一些能以某种方式解释代表的在线资源吗?
这是我怀疑VB实际上让我失望的那一刻,因为它在幕后为我做了一些布线.
理想的资源只是解释代表是什么,而不参考其他任何事件(事件和事件处理程序),会告诉我所有事情是如何连接起来的,解释(正如我刚才所了解的)委托是类型,是什么使它们作为一个独特的类型(也许使用一点ildasm魔法)).然后,该基础将扩展,以解释代表如何与事件和事件处理程序相关,这些事件和事件处理程序本身需要一个很好的解释.最后,这个资源可以使用真实示例将它们联系在一起,并解释编译器会自动发生哪些布线,如何使用它们等等.哦,是的,当你应该而且不应该使用代理时,换句话说,缺点和替代方案使用代表.
你说什么?你们中的任何人都可以向我指出可以帮助我开始掌握之旅的资源吗?
编辑 最后一件事.理想的资源将解释如何在接口声明中使用委托.这真是让我失望的事情.
谢谢你的帮助.
赛斯
Ste*_*edd 14
最简单的解释是委托允许您动态地将方法的"名称"分配给变量或将其作为参数传递(您没有分配字符串名称,它是对您分配的方法本身的引用)到变量).
然后,其他代码可以查看变量,并调用稍后存储的方法.
委托必须有一个定义(如接口),为此您使用delegate关键字.假设我们在某个地方有一个委托定义,如下所示:
public delegate bool NotifyFriendsDelegate(int intensity);
Run Code Online (Sandbox Code Playgroud)
这基本上只是说任何返回布尔值的方法(任何地方),并且采用int类型的单个参数是该委托的一个实例.因此委托定义指定方法必须匹配的形状或签名.
然后说我们有这样一个类:
public class MyCar
{
public bool GoVisitMyFriends(NotifyFriendsDelegate thingToDoWhenWeGetThere)
{
var doOurFriendsLikeUs = false;
var driving = new DrivingClass();
var didWeGetThere = driving.DoTheDrivingNowPlease();
if(didWeGetThere)
{
doOurFriendsLikeUs = thingToDoWhenWeGetThere(11);
}
return doOurFriendsLikeUs;
}
}
Run Code Online (Sandbox Code Playgroud)
这个类代表了一辆虚构的汽车,它有一个简单的方法,可以让汽车开到我们朋友家.如果汽车到达我们的朋友家,那么我们将要通知我们的朋友我们到了...但是汽车类并不知道如何通知我们的朋友.我们可能会大声播放立体声,我们可能会吹喇叭,或者我们可能会使用扩音器.
由于GoVisitMyFriends方法不知道如何准确地通知我们的朋友,而是要求调用代码传递对可以执行通知部分的某个方法的引用.GoVisitMyFriends并不关心你给它的方法,只要该方法的形状就像NotifyFriendsDelegate的定义一样(它必须返回boolean并接受int类型的一个参数).
现在让我们创建一个使用我们的虚构汽车的简单类:
public class MyFunClass()
{
public bool NotifyFriendsByRammingTheirHouse(int howHard)
{
var rammingModule = new RammingModule();
return rammingModule.RamFriendsHouse(howHard);
}
public bool DoSomethingFun()
{
var car = new MyCar();
var areWeCool = car.GoVisitMyFriends(NotifyFriendsByRammingTheirHouse);
return areWeCool;
}
}
Run Code Online (Sandbox Code Playgroud)
此类包含符合NotifyFriendsDelegate签名的方法.它包含一个名为DoSomethingFun的方法,它创建一个MyCar实例,然后调用GoVisitMyFriends方法.它传递了NotifyFriendsByRammingTheirHouse方法,以便当我们到达那里时,MyCar类将知道我们如何展示我们对朋友的爱.
这是我能想到的最简单的委托使用形式.
顺便说一句:我一直认为将事件视为包含委托方法集合的特殊变量很有用.可以为事件分配任何数量(零到无穷大)的委托,在调用事件时将调用所有委托.事件只是代表组,可以被视为"一件事".
| 归档时间: |
|
| 查看次数: |
7410 次 |
| 最近记录: |