C# 帮助理解.NET委托、事件和事件处理程序

C# 帮助理解.NET委托、事件和事件处理程序,c#,.net,vb.net,delegates,event-handling,C#,.net,Vb.net,Delegates,Event Handling,在过去的几天里,我问了几个关于代表和团队的问题。 我承认…我真的不明白。我真的很想理解和掌握它们。(我可以定义它们——类型安全的函数指针——但由于我对C类型语言几乎没有经验,所以它并没有真正的帮助。) 有谁能推荐一些在线资源,以一种不作任何假设的方式解释代表 这是我怀疑VB实际上妨碍我的时刻之一,因为它在幕后为我做了一些布线 理想的资源只是解释委托是什么,而不参考任何其他类似的内容(事件和事件处理程序),向我展示所有东西是如何连接起来的,解释(正如我刚刚学到的)委托是类型,以及是什么使它们作为一

在过去的几天里,我问了几个关于代表和团队的问题。 我承认…我真的不明白。我真的很想理解和掌握它们。(我可以定义它们——类型安全的函数指针——但由于我对C类型语言几乎没有经验,所以它并没有真正的帮助。)

有谁能推荐一些在线资源,以一种不作任何假设的方式解释代表

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

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

你说什么?你们中有谁能给我指出一些可以帮助我开始掌握的资源吗

编辑 最后一件事。理想的资源将解释如何在接口声明中使用和不使用委托。那件事真的把我绊倒了

谢谢你的帮助


赛斯

我最喜欢的解释来自克里斯·塞尔斯:


看一看C#编程指南-是代表部分。

我将从以下内容开始:


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

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

委托必须有一个定义(如接口),为此您使用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不在乎你给它什么方法,只要这个方法的形状和notifyfriendselegate的定义一样(它必须返回布尔值并接受一个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;
    }
} 
此类包含符合NotifyFriendsLegate签名的方法。它包含一个名为DoSomethingFun的方法,该方法创建MyCar的实例,然后调用GoVisitMyFriends方法。它通过notifyFriendsByrammingTheHouse方法传递,这样MyCar类就可以知道当我们到达那里时,我们想如何表达对朋友的爱

这是我能想到的最简单的委托用法


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

在解释中很难将委托与事件和事件处理程序分开,因为委托的创建主要是为了使这些功能成为可能。因此,大多数人,特别是那些试图解释代表和事件的人,经常会想到代表和事件。@Seth-你好,Seth,我正处在你的位置。我决不认为自己是个白痴。我读过Chris Sell的解释(不理解),读过教科书中的解释(我知道它是什么,但对何时使用它只是一个模糊的概念),读过stack overflow答案:我仍然不太清楚何时/为什么使用它:你有没有弄清楚它的底细?如果是这样的话,请帮我们解释一下?我讨厌这句话:“这基本上只是说,任何返回布尔值并接受int类型单个参数的方法(任何地方)都是此委托的实例”。但我不能怪你。这个话题很难解释。我甚至不敢尝试。在我看来,更好的类比是匿名函数像一个文字,普通函数像一个命名常量,委托变量很好。。。一个变量。呵呵,我知道你的意思。如果你深入研究技术实现,那么我的回答中几乎没有什么是“真实”或“准确”的。但我发现,这种对委托的一般性思考方式能够很好地引导开发人员对委托的含义有一个有用的理解。从那里,一个更准确的图片可以发展。。。但是,让模糊的广义概念被理解是困难的部分。事实上,事件是委托集合的包装器