繁体   English   中英

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

[英]VB.NET Why is this subroutine declared this way?

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)) ...

子名称后面的那部分是什么意思? 目的是什么? 非常感谢,对您的无知表示歉意。

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

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

一个类比是带有可移动头的螺丝刀。 您检查需要转动的螺钉,并为该螺钉选择正确的头部(开槽,划线,加星号)。 将正确的头插入螺丝起子手柄后,即可使用螺丝起子执行完全相同的功能,即旋转螺丝。

(Of T)是一个通用类型参数,添加为Control会约束T的类型以从Control继承。 您可以用第二种方法编写该方法,但是您可能最终不得不将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

在琐碎的情况下,它看起来不太有价值,但是在更复杂的情况下,它是无价的。

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

为什么这样做

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM