c# - 帮助理解 .NET 委托(delegate)、事件和事件处理程序

标签 c# .net vb.net delegates event-handling

<分区>

在过去的几天里,我问了几个关于委托(delegate)的问题 HEREHERE . 我承认......我真的不明白委托(delegate)。我真的真的真的很想理解和掌握它们。 (我可以定义它们——类型安全的函数指针——但由于我对 C 类型语言的经验很少,所以它并不是很有帮助。)

任何人都可以推荐一些在线资源来以一种不假设的方式解释委托(delegate)吗?

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

理想的资源应该只是解释委托(delegate)是什么,而不引用其他任何东西,比如(事件和事件处理程序),会告诉我所有的一切是如何连接的,解释(正如我刚刚了解到的)委托(delegate)是类型以及是什么让它们成为现实作为一种类型是独一无二的(可能使用了一点 ildasm 魔法))。然后该基础将扩展以解释委托(delegate)如何与事件和事件处理程序相关,这本身就需要一个很好的解释。最后,该资源可以使用真实示例将所有内容结合在一起,并解释编译器自动发生的连接、如何使用它们等。而且,哦,是的,什么时候应该和不应该使用委托(delegate),换句话说,缺点和替代方案使用委托(delegate)。

你说呢?你们中的任何人都可以指出可以帮助我开始精通之旅的资源吗?

编辑 最后一件事。理想的资源将解释您如何可以和不能在接口(interface)声明中使用委托(delegate)。这真的让我感到困惑。

感谢您的帮助。

赛斯

最佳答案

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

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

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

public delegate bool NotifyFriendsDelegate(int intensity);

这基本上只是说任何返回 bool 值并采用单个 int 类型参数的方法(任何地方)都是此委托(delegate)的实例。因此,委托(delegate)定义指定了方法必须匹配的形状或签名。

然后说我们有这样一个类:

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

这个类委托(delegate)一辆虚构的汽车,它有一个简单的方法让汽车开到我们 friend 家。如果汽车到达我们 friend 家,那么我们会想要通知我们的 friend 我们到达了......但是汽车类不知道如何通知我们的 friend 。我们可能会非常大声地播放立体声,我们可能会吹喇叭,或者我们可能会使用扩音器。

由于 GoVisitMyFriends 方法不知道如何准确地通知我们的 friend ,因此它要求调用代码传递对某个可以执行通知部分的方法的引用。 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 类知道我们到达那里时要如何表达对 friend 的爱。

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

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

关于c# - 帮助理解 .NET 委托(delegate)、事件和事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814065/

相关文章:

.net - 减慢控制台速度

.net - 如何在WPF中获得双击时间

vb.net - 拍摄一张并显示之前的一张 - VB - OpenCV

C#,Html Agility,选择 div 标签中的每个段落

c# - 在单独的行中列出项目

c# - foreach 循环抛出空异常但对象不是

vb.net - Visual Studio 输出窗口不显示 Debug.Write() 发送的消息

c# - 网络 API 2 404 错误

c# - Vector3.Projection 是什么意思?

asp.net - 将列表(字符串)绑定(bind)到中继器