VB.NET为什么这个子例程以这种方式声明?

时间:2010-11-24 01:42:49

标签: vb.net declaration identifier

VB.NET 2010,.NET 4

我有一个基本问题:我有一个子程序,我发现在网上某处声明:

Public Sub MyFunction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T)) ...

我想知道子名后的声明的(Of T As Control)部分。我看到T稍后用于指定Control的类型和Action(Of T),但为什么这样做而不是仅仅这样做:

Public Sub MyFunction(ByVal Control As Control, ByVal Action As Action(Of Control)) ...

子名后的那部分是什么意思?它的目的是什么?非常感谢,并为我的无知感到抱歉。

3 个答案:

答案 0 :(得分:3)

这是VB.NET的generic method声明语法:

  

泛型类型是单个编程   适应执行的元素   各种功能相同   数据类型。定义泛型时   类或程序,你不必   为每个人定义一个单独的版本   您可能想要的数据类型   执行该功能。

     

类比是一套螺丝刀   可拆卸的头。你检查螺丝   你需要转动并选择   正确的头螺钉(开槽,   划线,加星标)。一旦你插入   正确的头在螺丝刀   处理,你执行完全相同   用螺丝刀起作用,即   转动螺丝。

答案 1 :(得分:2)

(Of T)是一个泛型类型参数,添加As Control约束要从Control继承的T类型。你可以用第二种方式编写方法,但是你可能最终必须将Control转换为任何继承类型,在Action中的lambda表达式或MyFunction的主体中。泛型允许你避免这种情况。

例如:

Sub Main()
    Dim form As New Form()

    Dim textBox As New TextBox
    Dim listBox As New ListBox

    MyFunction(textBox, Sub(c) c.Text = "Hello")
    MyFunction(listBox, Sub(c) c.Items.Add("Hello"))

    MyFunction2(textBox, Sub(c) c.Text = "Hello")
    MyFunction2(listBox, Sub(c) CType(c, ListBox).Items.Add("Hello"))


End Sub

Public Sub MyFunction(Of T As Control)(ByVal Control As T, ByVal Action As Action(Of T))
    Action(Control)
End Sub

Public Sub MyFunction2(ByVal Control As Control, ByVal Action As Action(Of Control))
    Action(Control)
End Sub

在琐碎的案件中看起来并不太有价值,但对于更复杂的案件来说这是非常宝贵的。

答案 2 :(得分:1)

正如其他人所说,这是一个受约束的通用参数。但是还没有人解决你问题的这一部分:

  

为什么这样做

答案就在于行动。如果它只是声明为Control,你将无法做到这样的事情,因为并非所有控件都有.Text属性 *

MyFunction(MyTextBox, Function(t) t.Text = "new value" )

函数的主体只需要知道它正在处理某种控件,但是传递给函数的Action(Of T)可能想知道控件的实际类型。

是的,所有控件都有.Text属性。让我们假装有些人没有