9

VBの aFuncと aの違いを教えてください。Function

たとえば、次を参照してください。

Dim F As Func(Of String) = Function() As String
                             Return "B"
                           End Function
Dim F2 = Function() As String
           Return "B"
         End Function
  • Fとして表示されますFunc(Of String)
  • F2としてFunction() As String

それらは同じことをしているように見えますが、コンパイラーがそれらを異なる型として認識していることを考えると、微妙な違いがあるに違いありません。

よろしくお願いします

チャールズ

4

3 に答える 3

4

Func(Of TResult)()という名前の特定のデリゲートFuncです。System次のように名前空間内で宣言された型です。

Public Delegate Function Func(Of TResult)() As TResult

別の名前が付けられた可能性があります。例えば:

Public Delegate Function MyParameterLessFunction(Of TResult)() As TResult

これFuncは、デリゲートに付けられた名前にすぎません。の型がF2明示的に指定されていないため、VB はこのデリゲートの名前を知りません。Funcそれとも何かMyParameterLessFunction他のものですか?代わりに、 VBはその署名Function() As Stringを表示するだけです。F2

Public Delegate Function AnonymousParameterLessStringFunction() As String

コメントでは、.ToString()onFとを使用しますF2。これは実行時の型、つまりこれらの変数に割り当てられた値の型を返します。これらの型は、これらの変数の静的な型、つまり変数名に与えられた型とは異なる場合があります。ちょっとテストしてみましょう

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-time type of F:  System.Func`1[System.String]
Run-time type of F2: VB$AnonymousDelegate_0`1[System.String]
Static type of F: System.Func`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
Static type of F2: System.Object

F2と単純に入力されていることに注意してくださいObject。これは驚きです。私はそれがデリゲート型であることを期待していました。


この違いは、デバッガーでも確認できます。Testメソッドにブレークポイントを設定し、と のDimキーワードにカーソルを合わせるFF2、ポップアップが表示されます

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

'Dim of F2 (static type)
Class System.Object

変数名にカーソルを合わせると

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

'F2 (run-time type)
<generated method>

F型情報だけでなく、生成されたメソッド自体の名前も取得します。F2はオブジェクトであるため、Visual Studio は明らかに のように深く掘り下げませんF

于 2013-07-04T12:50:22.280 に答える
0

Funcデリゲート型 - System.Funcです。

Functionラムダ式を作成するために使用されるキーワードです。

上記のラムダ式はSystem.Linq.Expression(Of System.Func(Of String))型であり、実際にはデリゲート型Func(Of String)に暗黙的に変換可能です。

違いは、式が式ツリー (コードの構造を記述する) として格納されることです。暗黙的な変換中に、実際にはデリゲートにコンパイルされます。

于 2013-07-04T11:59:21.987 に答える