VB.NETと匿名メソッド
コーディング中に気になったのでいろいろ調べてみた。
C# 2.0から匿名メソッドがサポートされたんで、Listなんかの検索処理が簡単に書けるようになった。
List<string> list = new List<string>(); list.Add("hoge"); list.Add("huga"); string searchKey = "hoge"; string result = list.Find(delegate(string s) { return (s == searchKey); }); /* result の中身は"hoge" */
ここでのキモは変数searchKey。匿名メソッドと同じスコープにあるから匿名メソッドで参照することが可能だったりする。
でもVB2005だと匿名メソッドサポートされてないからC#みたいなことができない。C#に慣れているとこれが非常に歯がゆかったりする。
別途デリゲートを定義すればいいんだけどデリゲートって渡せる引数が決まっているから任意の値を渡したりすることはできない。やろうと思ったらprivateなフィールド経由で渡すことになるんだけど必要以上にスコープが広がってなんか気持ち悪い。
そこでなんか解決策無いかとぐぐってみたら以下のサイトを発見。
要はデリゲートとデリゲートで使う変数をクラスでラップし、そのデリゲートを取得するメソッドを用意してやるパターン。これなら変数のスコープもクラスの中に制限できるし必要な処理が一つにまとまっていい感じ。
これで要求は満たせるんだけどコードがゴテゴテしてしまうのが難点。リンク先にもあるけどなんでVB2005でも匿名メソッドサポートしてくれなかったんだろうなぁ。
VB2008はチェックしてないけどこの問題解決してるのかな?