什么是代表?

时间:2012-01-25 17:26:27

标签: performance c#-4.0 delegates action

我经常使用委托(Actions,WaitCallbacks,Funcs),但我试图更好地理解它们究竟是什么。

我对对象与引用类型等有相当好的理解,以及它们存储在堆与堆栈中的位置?

基本上 - 我试图从性能的角度理解使用代理。有没有人有任何资源链接或可能是一个很好的解释?

另外 - 究竟是什么'事件'?他们如何与代表联系?它们基本上只是一个被迭代的代表列表吗?

4 个答案:

答案 0 :(得分:2)

到目前为止所说的一切都是正确的。以下是它的工作原理:委托有两个字段:指向可执行代码的指针和表示此参数的类型对象字段(您可以将委托作为实例方法)。

当您调用此委托时,CPU将把代码指针提取到寄存器中,然后“调用”该指针。调用指令不需要使用常量值。 CPU可以跳转到内存中的可变位置。

事件只是委托加上两个包装方法来附加新委托或删除现有委托。令人困惑的部分是代表们有一个我遗漏的第三个领域:代表!代表形成一个链表。这被称为MulticastDelegate,它是一种憎恶。当您调用委托时,它可以导致具有相同签名的多个方法被调用。这就是事件的运作方式。事件是委托类型的单个字段。

现在忘记了多播代理,因为它们在实践中并不相关。

答案 1 :(得分:0)

委托是表示函数的数据结构 - 返回类型和参数(类型和数字)。可以将与委托返回类型和签名匹配的任何方法分配给此类委托。

在性能方面 - 这是一个额外的抽象层,但是一个小的抽象层。这不是你可能会注意到的。

答案 2 :(得分:0)

根据我的理解,代表可以是两种类型:

  • “实例绑定方法指针”,这意味着委托包含订阅对象的对象实例,以及要调用的对象类中的方法。如果我有MyClass.Handler(),并且我创建了五个MyClass实例,并为每个实例创建了5个委托,指向Handler()方法,那么每个委托将具有相同的方法指针,但是具有不同的对象实例。 / p>

  • 静态方法指针,例如静态方法的委托,在这种情况下不需要对象上下文。

事件是MulticastDelegate对象,您甚至可以检查它们以查看订阅事件的人员。使用反射,您可以审核您的活动的订阅者。

答案 3 :(得分:0)

委托是一个C#语言元素,允许您引用方法。如果您是C或C ++程序员,这听起来很熟悉,因为委托基本上是函数指针。但是,使用其他语言的开发人员可能会想,"为什么我需要对方法的引用?"。答案归结为为您提供最大的灵活性,以便在运行时实现您想要的任何功能。