Visual Basic .NETでは、匿名メソッドはラムダ式(FunctionまたはSub)を用いて実装されます。これにより、別の名前付きプロシージャを作成せずに小さなコードブロックを定義することができます。使用例:
Dim squared = Function(x As Integer) x * x Console.WriteLine(squared(5)) ' 出力: 25 Dim numbers = {1, 2, 3, 4} Dim evens = numbers.Where(Function(n) n Mod 2 = 0) For Each n In evens Console.WriteLine(n) Next
利点:
制限:
質問: "GoToステートメントを含むプロシージャを宣言するためにラムダ式を使用できますか?なぜですか?"
正しい答え: いいえ、VB.NETのラムダ式では、GoTo、GoSub、Labelなどの制御フローを使用することはできません。これは匿名メソッドの実装の特性によるものです。GoToを使用しようとするとコンパイルエラーが発生します。
コード例(エラーを引き起こす):
Dim broken = Sub() GoTo Label1 Label1: End Sub
事例
データ処理プロジェクトでGoToによる複雑な検証のためにラムダ式を使用しようとしました。通常のメソッドからラムダコードに移行する際にコンパイルエラーが発生し、機能のアーキテクチャを急遽変更する必要がありました。
事例
非同期呼び出しに匿名メソッドを使用しました。内蔵のラムダがループ内で変更される変数を誤って参照していました。これは、ラムダが変数の参照を「記憶」し、値を「記憶」しなかったため、予期しない結果をもたらしました — 結果として、報告書に謎のバグが現れました。
事例
あるプロジェクトでは、匿名メソッドを互換性のない型のデリゲートに直接変換していました(例えば、Functionの代わりにSub)。コンパイラは顕著なエラーを提示しませんでしたが、イベントハンドラは実行されませんでした。これは手動テストの際にのみ発見され、リリースの遅れを引き起こしました。