C# 9では、2つの新機能でラムダに小さなアップグレードが施される予定である。いずれもコードの記述方法を変えるものではないが、開発者の意図を明確にしてくれる。
Lambda Discard Parameterは、一部のパラメータが不要であることを、開発者が明示できるようにするものだ。使用しないパラメータに対する、不要なコンパイラ警告を回避することが可能になる。これが必要になるのは、イベントハンドラでsenderやobject parameterを必要としない場合などだ。
button1.Click += (s, e) => ShowDialog();
パラメータを下記のように置き換えることで、変数を使用しないことが明確になる。
button1.Click += (_, _) => ShowDialog();
必要ならば、型を使用することもできる。
var handler = (object _, EventArgs _) => ShowDialog();
Static Anonymous Functions機能は、ラムダや匿名関数がローカル変数(パラメータを含む)をキャプチャできないことを示すために使用する。次の例は、元となったプロポーザルで紹介されているものだ。
int y = 10;
someMethod(x => x + y); // captures 'y', causing unintended allocation.
C#では、ローカル変数を参照する匿名関数は、一時的なオブジェクトをアロケートする必要がある。その上で、ローカルパラメータがメソッドからそのオブジェクトに移されて、現在実行中の関数が終了するまで継続的に存在することになる。これが必要なのは、匿名関数それを生成した関数よりも長く存在するかも知れないからだ。
staticキーワードを加えることで、匿名関数のこのようなメモリアロケーションを回避することが可能になる。
int y = 10;
someMethod(static x => x + y); // error!
このエラーを修正するには、変数yを定数あるいは静的フィールドに変更する必要がある。
const int y = 10;
someMethod(static x => x + y); // okay :-)
以下に示すのは、この機能に関するおもなルールだ。
- Static Anonymous Functionは、外部スコープ(それを囲むスコープ)から状態をキャプチャすることはできない。結果として、外部スコープのローカル変数、パラメータ、
this
は、Static Anonymous Function内では使用できない。 - Static Anonymous Functionは、暗黙的ないし明示的な
this
やbase
参照からインスタンスメンバを参照することはできない。 - Static Anonymous Functionは、外部スコープの静的メンバを参照することができる。
- Static Anonymous Functionは、外部スコープの定数定義を参照することができる。
- Static Anonymous Function内のnameof()では、ローカル変数、パラメータ、
this
あるいはbase
を外部スコープから参照することができる。