代码之家  ›  专栏  ›  技术社区  ›  Seth Spearman

帮助理解.NET委托、事件和事件处理程序[重复]

  •  12
  • Seth Spearman  · 技术社区  · 14 年前

    在过去的几天里,我问了几个关于代表的问题 HERE HERE . 我承认…我不太了解代表。我真的很想理解和掌握它们。(我可以定义它们——类型安全的函数指针——但是由于我对C类型语言没有太多经验,它实际上没有帮助。)

    有人能推荐一些在线资源,以一种不做任何假设的方式解释委托吗?

    这是我怀疑VB实际上妨碍了我的一个时刻,因为它在幕后为我做了一些布线。

    理想的资源只是解释什么是委托,而不参考任何其他类似的内容(事件和事件处理程序),它将向我展示所有东西是如何连接起来的,解释(正如我刚刚学到的)委托是类型,以及是什么使它们作为一种类型独特(可能使用一点ildasm魔力)。然后,这个基金会将扩展到解释代表如何与事件和事件相关者,这在他们自己的权利中需要一个很好的解释。最后,这个资源可以使用实际的例子将它们联系在一起,并解释编译器自动进行的连接,如何使用它们等等。哦,是的,当您应该并且不应该使用委托时,换句话说,使用委托的缺点和替代方法。

    你们说什么?你们中有人能给我指点资源,帮助我开始掌握知识的旅程吗?

    编辑 最后一件事。理想资源将解释如何在接口声明中使用委托和不能使用委托。这真让我吃惊。

    谢谢你的帮助。

    塞思

    4 回复  |  直到 5 年前
        2
  •  12
  •   Stephen M. Redd    14 年前

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

    然后,其他代码可以查找变量,并调用存储在该变量中的方法。

    委托必须有一个定义(如接口),为此,您可以使用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类就可以知道,当我们到达那里时,我们是如何表达对朋友的爱的。

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

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

        3
  •  6
  •   Oren Hizkiya    8 年前

    我最喜欢的解释来自克里斯销售:

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

        4
  •  0
  •   Oded    14 年前

    看一下C编程指南- here 是“代理”部分。