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)) ...
子名后的那部分是什么意思?它的目的是什么?非常感谢,并为我的无知感到抱歉。
答案 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属性。让我们假装有些人没有