VB中的Func与函数

Cha*_*les 9 vb.net lambda

有人能告诉我在VB中Func和Function之间有什么区别.

例如,请参阅以下内容:

Dim F As Func(Of String) = Function() As String
                             Return "B"
                           End Function
Dim F2 = Function() As String
           Return "B"
         End Function
Run Code Online (Sandbox Code Playgroud)

F作为Func(Of String)F2显示为Function()作为字符串.

看起来他们做同样的事情,但鉴于编译器认为它们具有不同的类型,肯定必须存在一个副性.

最好的祝福

查尔斯

Oli*_*bes 5

Func(Of TResult)()是一个名为 的特定委托Func。它是在命名空间内声明的类型,System如下所示:

Public Delegate Function Func(Of TResult)() As TResult
Run Code Online (Sandbox Code Playgroud)

它可能有不同的命名。例如:

Public Delegate Function MyParameterLessFunction(Of TResult)() As TResult
Run Code Online (Sandbox Code Playgroud)

SoFunc实际上只是赋予代表的名称。由于未明确指定 的类型F2,因此 VB 不知道该委托的名称。是它Func还是MyParameterLessFunction别的什么?相反,VB 只是显示其签名Function() As String,因为F2它也适合声明为的非通用委托

Public Delegate Function AnonymousParameterLessStringFunction() As String
Run Code Online (Sandbox Code Playgroud)

在您的评论中,您使用了.ToString()和。这将返回运行时类型,即分配给这些变量的值的类型。这些类型可以不同于这些变量的静态类型,即赋予变量名称的类型。我们来做个小测试FF2

Imports System.Reflection

Module FuncVsFunction
    Dim F As Func(Of String) = Function() As String
                                   Return "B"
                               End Function
    Dim F2 = Function() As String
                 Return "B"
             End Function

    Sub Test()
        Console.WriteLine($"Run-time type of F:  {F.ToString()}")
        Console.WriteLine($"Run-time type of F2: {F2.ToString()}")

        Dim moduleType = GetType(FuncVsFunction)
        Dim fields As IEnumerable(Of FieldInfo) = moduleType _
            .GetMembers(BindingFlags.NonPublic Or BindingFlags.Static) _
            .OfType(Of FieldInfo)

        For Each member In fields
            Console.WriteLine($"Static type of {member.Name}: {member.FieldType.Name}")
        Next
        Console.ReadKey()
    End Sub
End Module
Run Code Online (Sandbox Code Playgroud)

它显示

Public Delegate Function Func(Of TResult)() As TResult
Run Code Online (Sandbox Code Playgroud)

请注意,F2只需键入为Object。这是一个惊喜。我希望它是一个委托类型。


您还可以在调试器中看到这种差异。如果您在方法中设置断点Test,然后将鼠标悬停在andDim的关键字上,则会显示一个弹出窗口FF2

'Dim of F (static type)
Delegate Function System.Func(Of Out TResult)() As String

'Dim of F2 (static type)
Class System.Object
Run Code Online (Sandbox Code Playgroud)

如果将鼠标悬停在变量名称上

'F (run-time type)
Method = {System.String _Lambda$__0-0()}

'F2 (run-time type)
<generated method>
Run Code Online (Sandbox Code Playgroud)

因为F您不仅可以获得类型信息,还可以获得生成的方法本身的名称。由于F2是一个对象,Visual Studio 显然不会像F.