65.9K
CodeProject 正在变化。 阅读更多。
Home

VB.NET 中的委托

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (16投票s)

2008 年 10 月 26 日

CPOL

5分钟阅读

viewsIcon

132379

解释 VB.NET 中委托的基本概念

VB.NET 中的委托

委托类似于 C、C++ 中的函数指针。现在,如果您不了解 C、C++ 或 Java,您可能会想“指针是什么?”。下面是一个简单的例子

'This is sample Class for example
Public Class ShabsSampleClass
'This is sample method except as Parameter
Sub DoSomeWork(ByVal strWork As String)
Console.Write(strWork)
End Sub
'This is main function for this class
Sub Main()
Dim strDiggingWork As String
strDiggingWork = "Start Digging the Ground"
DoSomeWork(strDiggingWork)
End SubEnd Class

太好了,现在,想想将一个函数作为参数传递。我说什么?将某个函数作为参数。这意味着将存在一个像 GetSomeWork 这样的函数,它接受一个函数作为参数,而您将 DoSomeWork 作为参数传递给这个函数。是的,您可以在 .NET 中做到这一点。如果您不知道这一点,这会让您感到非常惊喜。对我来说也是如此。

当您将函数作为参数传递时,这被称为委托

像 mouseclick、keypress、ApplicationStart(在 ASP.NET 中)等所有事件都在 .NET 中处理某些委托。您可能不知道,但 VS IDE(Visual Studio 集成开发环境)会为您处理这些。

关于委托,您应该知道的几点

  1. 声明 委托就像 VB.NET 中的普通过程/方法,它接受一个参数但根据方法类型不返回。如果是 Sub 方法,则不返回 Sub;如果是 Function 方法,则不返回类型。
  2. 委托不返回任何类型的值。从技术上讲,一个 Sub 委托返回一个 Sub 指针,但暂时请记住,它们不返回任何值。
  3. 委托只有声明,没有主体。
  4. Public Delegate Sub SomeWorkDelegate(ByVal strSomeString As String)
    'Here, there would be no body for delegate, like it has for Sub
    'No END SUB here
  5. 要使用委托,您需要将某个函数附加给它。委托本身什么也不做。

以下是如何使用委托的示例

'This is sample Class for example
Public Class ShabsSampleClass
	'This is sample method except as Parameter
	Sub DoSomeWork(ByVal strWork As String)
		Console.Write(strWork)
	End Sub
	'This is where, I create a Delegate with String Parameter
	Public Delegate Sub SomeWorkDelegate(ByVal strSomeString As String)
		'Here is some function, which will accept other function as parameter via some delegate
		Public Sub GetSomeWork(ByVal someDelegateFunc As SomeWorkDelegate)
		'call someDelegateFunc to so some owrk
		someDelegateFunc("Here is the work")
	End Sub
	'This is main function for this class
	Sub Main()
		'Declaring private delegate in this function with address of DoSomeWork function 
		Dim myWorkDel As SomeWorkDelegate = New SomeWorkDelegate(AddressOf DoSomeWork)
		'Using GetSomeWork function
		GetSomeWork(myWorkDel)
	End Sub
End Class

这是什么鬼,我什么都看不懂!别担心,我下面会向您解释。要理解这一点,让我们逐行分析

  1. 第一行
  2. Public Delegate Sub SomeWorkDelegate(ByVal strSomeString As String)

    在这里,您声明了一个委托,它将接受一个 String 作为参数。现在,将来它将指向一个只接受一个 String 作为参数的函数。如果我有一个函数,它接受两个 String 参数作为输入呢?抱歉,各位,不能使用此委托指向您的函数,您需要声明另一个委托,它接受两个 String 参数作为输入。

  3. 第一个函数
  4. 'Here is some function, which will accept other function as parameter via some delegate
    Public Sub GetSomeWork(ByVal someDelegateFunc As SomeWorkDelegate)
      'call someDelegateFunc to so some owrk
      someDelegateFunc("Here is the work")
    End Sub

    在这里,我们声明了一个函数,它将接受另一个函数作为参数。就像我将接受一个函数作为参数,该函数只有一个 string 参数。

    (ByVal someDelegateFunc As SomeWorkDelegate)

    此参数告诉 VB.NET,它期望一个函数作为参数,该函数具有与委托 SomeWorkDelegate 相同的签名,即只有一个作为输入的参数,而且该参数必须是 String。这意味着,我可以将世界上所有具有一个 String 参数的函数传递给这个函数。是的,有一个要求,我需要在我自己的函数中使用这个委托函数,所以我才使用它。所以现在这个函数只有在我传递一个 String 参数时才能工作。例如,someDelegateFunc("Here is the work")

    我为什么需要做这种事情?好吧,如果您的世界是某个大学项目或某个初级项目,您就不需要这样做。这是因为您知道您项目中的所有函数。您会直接使用它们,而不是进行这种声明委托并使用它的“马戏表演”。
    但是,在一些非常大的项目中,比如 .NET 框架本身,其中有 5000 个类和数百万个函数,并且需要遵守 OOPS 原则,并且有大约 500 人在参与这个项目,遍布全球,也就是说,有美国、印度、巴西、加拿大等地的团队!在这里,您不知道所有的函数,并且需要为您的类设计增加灵活性和可扩展性。

    但是,即使在大学项目中,使用它也是有益的,谁知道呢,您编写的代码可能会改变世界,然后,您几行代码的项目将增长到数百万行代码,您的核心类将被其他人使用。
    如果您使用了委托,您就不需要重写您的核心类以适应依赖于您的类的其他类。

    我知道,这有点冗长,对您来说阅读起来很费劲,所以我需要在这里结束。

  5. 主函数

    'This is main function for this class
    Sub Main()
    'Declaring private delegate in this function with address of DoSomeWork function 
    Dim myWorkDel As SomeWorkDelegate = New SomeWorkDelegate(AddressOf DoSomeWork)
    'Using GetSomeWork function
    GetSomeWork(myWorkDel)
    End Sub

    在这里,在 main 函数中,我们将把所有内容整合在一起。

    Dim myWorkDel As SomeWorkDelegate = New SomeWorkDelegate(AddressOf DoSomeWork)


    在这里,在您的 main 函数中,您声明了一个委托,这是一个私有变量。然后,您将 'DoSomeWork' 函数附加到此委托。为什么?
    因为,在该函数下面,您将使用此委托。
    由于我知道 'SomeWorkDelegate' 有一个参数,而且还是 string 类型,并且还有一个函数 'DoSomeWork',它也只有一个参数,而且也是 string 类型。我将此函数附加到此委托。

    'Using GetSomeWork function
    GetSomeWork(myWorkDel)


    在这里,我想使用函数 GetSomeWork,它接受委托 'SomeWorkDelegate' 作为参数,因此,我将使用这个函数,并将 'myWorkDel' 作为参数。'myWorkDel' 只是您在上面一行声明的私有委托,并将其附加到 'DoSomeWork'。

    那么,GetSomeWork 中会发生什么?
    此函数将接收 'myWorkDel' 作为参数,它将指向 'DoSomeWork' 方法。因此,它实际要做的工作是,在 GetSomeWork 中的下面这行,

    someDelegateFunc("Here is the work")

    对编译器来说,看起来就像

    DoSomeWork("Here is the work")

剩下的您就知道了。事件和委托还有更多内容,我将在其他帖子中,例如“第二部分”中提及!

在这里,在函数 DoSomeWork 中,我们已经传递了 String 参数。现在,您可能会说,这有什么新的?我早就知道了。我知道,还有更多,比如您可以传递类、对象、多个参数甚至参数数组作为参数。那又有什么新意呢!

© . All rights reserved.