はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】C#9.0から導入された静的匿名関数(Static anonymous functions)を利用して状態のキャプチャを禁止する

はじめに

今回はC#9.0から導入された静的匿名関数(Static anonymous functions)について取り上げたいと思います。
learn.microsoft.com

概要

ラムダおよび匿名メソッドに対して ' static ' 修飾子を許可します。これにより、含まれるスコープからのローカルまたはインスタンスの状態のキャプチャが禁止されます。

Static anonymous functions - C# 9.0 specification proposals | Microsoft Learn

staticをつけることで何か新しいことができるというわけではなく、匿名関数が状態をキャプチャをしないことを明示的に強制することができます。

private static int _staticNum = 0;
private int _num = 1;
        
private void Start()
{
    var a = 0;

    // aをキャプチャしてしまうのでコンパイルエラー
    Func<int, int> func = static x => a * x;

    // _numをキャプチャしてしまうのでコンパイルエラー
    Func<int, int> func2 = static x => _num * x;

    // 純粋関数になっているのでOK
    Func<int, int> func3 = static x => x * x;

    // static変数はOK
    Func<int, int> func4 = static x => x * _staticNum;
}

すごい便利だと思います。