帮助理解.NET委托,事件和事件处理程序

在过去的几天里,我在这里和这里问了几个关于代表的问题。 我承认……我真的不了解代表们。 我真的非常想要理解并掌握它们。 (我可以定义它们 – 键入安全函数指针 – 但由于我对C类型语言没什么经验,所以它并没有用。)

任何人都可以推荐一些能以某种方式解释代表的在线资源吗?

这是我怀疑VB实际上让我失望的那一刻,因为它在幕后为我做了一些布线。

理想的资源只是解释代表是什么,而不参考任何其他类似的东西(事件和事件处理程序),会告诉我所有的东西是如何连线的,解释(正如我刚才所知)委托是类型,是什么使它们作为一个独特的类型(也许使用一点ildasm魔法))。 然后,该基础将扩展,以解释代表如何与事件和事件处理程序相关,这些事件和事件处理程序本身需要一个很好的解释。 最后,这个资源可以使用真实示例将它们联系在一起,并解释编译器自动发生的连接,如何使用它们等等。哦,是的,当你应该而且不应该使用代理时,换句话说,缺点和替代方案使用代表。

你说什么? 你们中的任何人都可以向我指出可以帮助我开始掌握之旅的资源吗?

编辑最后一件事。 理想的资源将解释如何在接口声明中使用委托。 这真是让我失望的事情。

谢谢你的帮助。

赛斯

最简单的解释是委托允许您动态地将方法的“名称”分配给变量或将其作为参数传递(您没有分配字符串名称,它是对您指定的方法本身的引用)到变量)。

然后,其他代码可以查看变量,并调用稍后存储的方法。

委托必须有一个定义(如接口),为此您使用delegate关键字。 假设我们在某个地方有一个委托定义,如下所示:

public delegate bool NotifyFriendsDelegate(int intensity); 

这基本上只是说任何返回布尔值的方法(任何地方),并且采用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; } } 

这个类代表了一辆虚构的汽车,它有一个简单的方法,可以让汽车开到我们朋友家。 如果汽车到达我们的朋友家,那么我们将要通知我们的朋友我们到达了……但是汽车类并不知道如何通知我们的朋友。 我们可能会大声播放立体声,我们可能吹喇叭,或者我们可能会使用扩音器。

由于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; } } 

此类包含符合NotifyFriendsDelegate签名的方法。 它包含一个名为DoSomethingFun的方法,它创建一个MyCar实例,然后调用GoVisitMyFriends方法。 它传递了NotifyFriendsByRammingTheirHouse方法,以便当我们到达那里时,MyCar类将知道我们如何表达对朋友的爱。

这是我能想到的最简单的委托使用forms。

顺便说一句:我一直认为将事件视为包含委托方法集合的特殊变量很有用。 可以为事件分配任意数量(零到无穷大)的委托,所有这些委托都将在调用事件时调用。 事件只是代表组,可以被视为“一件事”。

我最喜欢的解释来自Chris Sells:

http://sellsbrothers.com/public/writing/delegates.htm

看一下C#编程指南 – 这是代表部分。