什么是代表,他们是如何使用的?

时间:2013-07-23 18:52:14

标签: vb.net delegates invoke

在被用户警告我的问题基础是基于错误的知识后,我已经编辑了这个问题的标题,应该是我原来的问题,并删除了以前的内容。以下是我认为对代表们的一个很好的解释。

1 个答案:

答案 0 :(得分:2)

根据您的意见,您对delegates的看法似乎并不完全清楚。因此,这个答案的重点在于澄清代表的实际内容,以便您可以运用这些知识来理解您提出的代码或任何其他与代理相关的情况。

委托是将函数视为变量的一种方法。也就是说,而不是做Dim myString as String = "this",而是替换"这个"有功能。

简单的代码,以阐明委托是什么以及如何处理它:

Public Class Form1

    Public Delegate Sub subDelegate(arg1 As String, arg2 As String)
    Public subDelegateVar As subDelegate

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        subDelegateVar = New subDelegate(AddressOf origSub)
        subDelegateVar.Invoke("this", "that")

    End Sub

    Public Sub origSub(arg1 As String, arg2 As String)
        MsgBox("I want to write " & arg1 & " and " & arg2)
    End Sub

End Class

您有功能(SuborigSub,并且您希望将其视为变量。首先要做的是声明一个匹配其结构的委托:

Public Delegate Sub subDelegate(arg1 As String, arg2 As String)

这就像定义type(上例中的string type)一样。下一步是声明与此类型相关联的变量(上例中的myString),使用以下代码完成的操作:

Public subDelegateVar As subDelegate

第三步是将此变量分配给您想要的值(myString = "this")通过以下方式完成:

subDelegateVar = New subDelegate(AddressOf origSub)

这里Invoke是什么?只是为了调用给定的函数。为什么要创建一个新变量(委托),为它分配一个函数并使用Invoke来调用函数而不是直接调用这个函数?因为有时你需要将函数作为变量来对待;例如:当你想将它(整个函数)作为参数传递给另一个函数时 - >这是代表被要求的原因之一,而不是唯一的(甚至不接近)。