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

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类将知道我们如何展示我们对朋友的爱.

这是我能想到的最简单的委托使用形式.

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


Jos*_*gan 6

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

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