匿名メソッドによってキャプチャされる変数

匿名メソッド内から、外部の変数にアクセスしたときの挙動の話。
連載:C# 2.0入門 第5回 匿名メソッドとデリゲート

匿名メソッドがキャプチャする変数の実態は、その匿名メソッドを定義した時点での、その変数へのポインタ(値ではなく)だということらしい。サンプルにあったforループのケースで嵌ったときに薄々気づいていたけど、これでクリアになった。

それにしてもややこしいことに代わりはないし、リファクタリングの妨げにもなるから、匿名関数内からは外側の変数へのアクセスを避けて引数付きのdelegateを定義するのが分かりやすい書き方かな。

Javaでは、匿名クラスからローカル変数を参照する場合は、変数のfinal指定が必須だ。だから匿名クラス内から参照する外部ローカル変数について、変数の値をコピーして保持しているのかポインタを保持しているのかについて悩む必要はない。今まで、あのルールは機能を制限するために必要なのだろうと思っていたけど、プログラマが混乱しないように、というJavaらしい配慮なのかも、ということに思い当たった。