2010-11-24 106 views
2

VB.NET 2010,.NET 4VB.NET为什么这个子程序是这样声明的?

我有一个基本的问题:我有一个子程序,我发现网上的地方正是如此宣称:我想了解一下该(中T作为

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

控制)子名称后的声明部分。我看到T在指定控制和行动(中T)的类型后使用,但它为什么做这样而不是仅仅做:

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

是什么子的名字后面那部分是什么意思?它的目的是什么?非常感谢,为我的无知感到遗憾。

回答

2

(Of T)是泛型类型参数,添加As Control约束从Control继承的T的类型。你可以用第二种方式编写方法,但是你可能最终不得不将控制转换为任何继承类型,在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 

它看起来不是简单的情形太有价值了,但它是无价的更复杂的情况。

+0

我明白了。出于好奇,我想知道为什么事件处理子例程的签名没有这个。你会认为你可以做一些像Private Sub Control_Click(Of T As Object)(ByVal sender As T,ByVal e as EventArgs),这样如果我想访问它的属性,我不会总是需要施放'sender'。或者这没有任何意义?感谢您的回应。 – 2010-11-24 01:55:36

+0

感谢您的阐述。 – 2010-11-24 02:04:46

3

即VB.NET的generic method声明语法:

一个通用类型是适应用于各种 数据类型的执行 相同功能的单个编程 元件。当您定义类别或过程的通用 时,您不必为每个 数据类型定义单独的版本,您可能希望 执行该功能。

一个比喻是设置了 可拆卸磁头的螺丝刀。您检查您需要转动的螺丝钉 并选择 正确的螺丝头(开槽, 交叉,加星号)。一旦将 正确头部插入螺丝刀 手柄中,就可以用螺丝刀完成相同的 功能,即使用 旋转螺丝。

+0

感谢您的快速反应和类比! – 2010-11-24 01:56:00

1

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

为什么会做这样

答案是在行动。如果只是声明为一个控制,你不能这样做,因为不是所有的控件都有。文本属性*

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

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

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

相关问题