2

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)部分。我看到后来在指定Control的类型和Action(Of T)中使用了T,但是为什么要这样做而不是这样做:

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

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

4

3 回答 3

3

这是 VB.NET 的通用方法声明语法:

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

一个类比是带有可拆卸头的螺丝刀套装。您检查需要转动的螺钉并为该螺钉选择正确的头部(开槽、交叉、星号)。将正确的头部插入螺丝刀手柄后,您就可以使用螺丝刀执行完全相同的功能,即转动螺丝。

于 2010-11-24T01:47:46.077 回答
2

(Of T) 是泛型类型参数,添加 As Control 约束 T 的类型继承自 Control。您可以使用第二种方式编写该方法,但您可能最终不得不在 Action 的 lambda 表达式或 MyFunction 的主体中将 Control 强制转换为任何继承的类型。泛型可以让你避免这种情况。

例如:

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

它在琐碎的情况下看起来并没有太大的价值,但对于更复杂的情况来说却是无价的。

于 2010-11-24T01:49:24.970 回答
1

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

为什么这样做

答案就在行动中。如果它只是被声明为控件,您将无法执行此类操作,因为并非所有控件都具有 .Text 属性*

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

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

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

于 2010-11-24T01:55:51.663 回答