在过去的几天里,我问了几个关于委托(delegate)的问题 HERE和 HERE .
我承认......我真的不明白委托(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)组。