このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

ラムダ式

  • VB2008からはラムダ式を使うことができるようになった。
  • ラムダ式は単純なデリゲート(VB.NET/文法/デリゲート)をシンプルに記述するための方法である。
  • ラムダ式を使ってメソッドベースのLINQ文の引数をシンプルに記述することができる。

ラムダ式の構文

Function(<パラメータリスト>) <式>
  • ラムダ式のパラメータリストはFunctionステートメントと同様であるが、戻り値はReturn文ではなく<式>となる。
    • このため、戻り値の型を明示的に指定することができない。
  • VB2010からはFunctionキーワードの他にSubキーワードも利用できる。

例:

  1
  2
  3
  4
Sub MyMethod()
    Dim f = Function(a As Integer) a * 2
    Dim d As Integer = f(10)
End Sub

 これは次のDeleteと同じである。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
Delegate Function CalcDelegate(ByVal a As Integer) As Integer
 
Sub MyMethod()
    Dim f As CalcDelegate = New CalcDelegate(AddressOf Calc)
    Dim d As Integer = f(10)
End Sub
 
Function Calc(ByVal a As Integer) As Integer
    Return a * 2
End Function

イベントハンドラの場合

例:

  1
  2
  3
  4
  5
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MessageBox.Show("test")
    End Sub
End Class

↓明示的にイベントハンドラを設定する。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
Public Class Form1
    Public Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()
 
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MessageBox.Show("test")
    End Sub
End Class

↓.NET Framework 2.0以降ではEventHandler型のデリゲートインスタンスを指定するところを省略できる。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
Public Class Form1
    Public Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()
 
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        AddHandler Button1.Click, AddressOf Button1_Click
    End Sub
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MessageBox.Show("test")
    End Sub
End Class

↓ラムダ式を利用。

  1
  2
  3
  4
  5
  6
  7
  8
  9
Public Class Form1
    Public Sub New()
        ' この呼び出しは、Windows フォーム デザイナで必要です。
        InitializeComponent()
 
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        AddHandler Button1.Click, Function(sender, e) MessageBox.Show("test")
    End Sub
End Class

LINQの場合

ラムダ式とスコープ

  • ラムダ式は上位のスコープの変数を参照できる。
  1
  2
  3
  4
  5
  6
  7
  8
Sub Method()
    Dim c As Integer = 5
    Dim f As CalcDelegate = Function(a As Integer) a * c
    c = 10
 
    'ラムダ式を実行(10倍した値を返す).ラムダ式を実行するタイミングで変数cの値が利用される。
    Process(f)
End Sub

参考文献

  • 『VisualBasic2008入門』