[.NET 4][VS2010][VB]
※.NET4以前のバージョンでは記述できない可能性があります。注意してください。デリゲートとは、関数を変数のように扱うことです。
宣言は以下のように行い、
'処理を1行で記述する場合
Dim x As Action = Sub() Debug.Print("Sample")
'処理を複数行で記述する場合
Dim y As Action = Sub()
Debug.Print("Sample")
End Sub
'引数を利用する場合
Dim z As Action(Of String) = Sub(args As String) Debug.Print(args)
呼び出すときには以下のようにします。
x.Invoke()
y.Invoke()
z.Invoke("Sample")
で、何に利用できるのか?というと以下のようなことができます。
関数を変数のように扱うことができる。
他の関数に渡すことで、部分的なロジックを差し替えることができる。
まだピンとこないと思いますので、DB接続処理をサンプルに実例を挙げてみます。
例
・ボタン1をクリックすると、DBサーバーのシステム日付をデバッグウインドウに表示する。
・ボタン2をクリックすると、Employeesテーブルの行数をデバッグウインドウに表示する。
※処理内容に特に意味はないです。
脳内で主キー検索、名前検索などの実用的なものに置き換えてください。
これを単純にコード化すると以下のようになります。
Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Using cn As New SqlClient.SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False")
cn.Open()
Dim cmd As IDbCommand = cn.CreateCommand
cmd.CommandText = "SELECT CURRENT_TIMESTAMP"
Debug.Print(cmd.ExecuteScalar)
End Using
End Sub
Private Sub Button2_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button2.Click
Using cn As New SqlClient.SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False")
cn.Open()
Dim cmd As IDbCommand = cn.CreateCommand
cmd.CommandText = "SELECT COUNT(*) FROM EMPLOYEES"
Debug.Print(cmd.ExecuteScalar)
End Using
End Sub
ボタン1とボタン2で全く同じDB接続処理を書いてますが、中身(発行するクエリ)が違うのでサブルーチン化(関数化)できません。
「SqlConnectionのインスタンスからコネクションの接続まで」をサブルーチン化することも可能ですが、
Using構文が使えなくなるので手動でDisposeする必要が出てきてしまい、記述漏れのことを考えるとベストと言いがたいです。
※接続文字列を定数化して記述ミスを防ぐというのはアリですが、それは一旦置いときます。
メインルーチンでIDbCommandクラスを生成し、それを関数(コネクション処理と引数のコマンドを実行する)に投げるという方法も考えられます。
が、複数のコマンドを1回の接続のうちに実行したい事例がでてきたら破綻してしまいます。
※そもそも戻り値の型を何にするかで揉めそうですが。
そこで、デリゲート(関数の変数化、ロジックの差し替え、委譲)の出番です。
続きを読む ...