C# 9 Static Anonymous Function
C# 9 Static Anonymous Function
25 May 2021
Very important improvement in C# 9 which allows a ‘static’ modifier on lambdas and anonymous methods, which disallows capture of locals or instance state from containing scopes.
The whole motive behind this is to avoid unintentionally capturing state from the enclosing context, which can result in unexpected retention of captured objects or unexpected additional allocations.
This case can be fixed by adding the modifier static on the lambda and use const modifier on the variable you don’t want to be captured, in that way any enclosing context will be captured there:
An anonymous method may have a static modifier. The static modifier shows that the lambda or anonymous method is a static anonymous function. It cannot capture the state from the enclosing scope. As a result, locals, parameters, and this from the enclosing scope are not available within the same. Also, it cannot reference the instance members from an implicit or explicit this or base reference. This function may reference static members from the enclosing scope. It may reference constant definitions from the enclosing scope. The function nameof() in a static anonymous function may reference locals, parameters, or this or base from the enclosing scope. No guarantee is made as to whether a static anonymous function definition is emitted as a static method in the metadata. Then all this is left up to the compiler implementation to optimize. A non-static local function or anonymous function can capture state from an enclosing static anonymous function but cannot capture state outside the enclosing static anonymous function. Removing the static modifier from the function in a valid program does not affect the logic of the program. a ‘static’ modifier on lambdas and anonymous methods, which disallows capture of locals or instance state from containing scopes.
The whole motive behind this is to avoid unintentionally capturing state from the enclosing context, which can result in unexpected retention of captured objects or unexpected additional allocations.
This case can be fixed by adding the modifier static on the lambda and use const modifier on the variable you don’t want to be captured, in that way any enclosing context will be captured there:
An anonymous method may have a static modifier. The static modifier shows that the lambda or anonymous method is a static anonymous function. It cannot capture the state from the enclosing scope. As a result, locals, parameters, and this from the enclosing scope are not available within the same. Also, it cannot reference the instance members from an implicit or explicit this or base reference. This function may reference static members from the enclosing scope. It may reference constant definitions from the enclosing scope. The function nameof() in a static anonymous function may reference locals, parameters, or this or base from the enclosing scope. No guarantee is made as to whether a static anonymous function definition is emitted as a static method in the metadata. Then all this is left up to the compiler implementation to optimize. A non-static local function or anonymous function can capture state from an enclosing static anonymous function but cannot capture state outside the enclosing static anonymous function. Removing the static modifier from the function in a valid program does not affect the logic of the program.