2

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

4

1 回答 1

2

从你所说的来看,你的想法delegates似乎并不完全清楚。因此,这个答案的重点是澄清委托实际上是什么,以便您可以应用这些知识来理解您提出的代码或任何其他与委托相关的情况。

委托是一种将函数视为变量的方法。也就是说,不是做,而是Dim myString as String = "this"用一个函数代替“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

你有函数 ( Sub)origSub并且你想把它当作一个变量。您要做的第一件事是声明一个与其结构匹配的委托:

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

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

Public subDelegateVar As subDelegate

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

subDelegateVar = New subDelegate(AddressOf origSub)

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

于 2013-07-23T19:40:12.160 回答