InfoQ Homepage News C# Futures: Lambda Attributes

C# Futures: Lambda Attributes

Leia em Português


Attributes are a key part of .NET’s metadata processing capabilities. They are used by compilers, static analyzers, and runtime libraries for a variety of purposes. While normal functions/methods can have attributes, prior to this proposal lambdas and anonymous functions could not.

While in theory any attribute applicable to normal functions/methods could be applied to a lambda, there are new attributes being considered specifically for them. These new attributes control what can be captured by the lambda.

  • CaptureNone: No variables can be captured. The lambda will be compiled as a static function.
  • CaptureThis: Only the ‘this’ pointer will be captured. The lambda will be compiled as a method.
  • CaptureAny: Any local variable can be captured. The lambda will be compiled as part of an anonymous closure object.

When working with performance sensitive code, CaptureAny should be avoided because a new delegate and matching closure object need to be created for each instance. CaptureThis isn’t as bad, but a new delegate still must be allocated. This delegate could result in inefficient memory use if it keeps the outer object alive longer than otherwise necessary. Finally, CaptureNone would only need to create one instance of a delegate that could be reused throughout the life of the application.

When applied to a lambda, the attributes would be used by the compiler or an analyzer to ensure a CaptureNone lambda isn’t accidentally changed to a less efficient type in the future. Essentially the attributes would act as a form of documentation.

This concept isn’t new. For example, in C++ lambdas one has to explicitly list all variables the lambda can capture. The difference here is that the attributes would be optional in C# (unless otherwise enforced by an analyzer).

Under this proposal, attributes can also be added to the parameters on a lambda. In order to avoid confusion, parameters must be enclosed in parens when using attributes. If the attribute is also inside the paren, it applies to the parameter. Attributes outside of the parens apply to the lambda as a whole.

For more information see the Lambda Attributes proposal on GitHub.

We need your feedback

How might we improve InfoQ for you

Thank you for being an InfoQ reader.

Each year, we seek feedback from our readers to help us improve InfoQ. Would you mind spending 2 minutes to share your feedback in our short survey? Your feedback will directly help us continually evolve how we support you.

Take the Survey

Rate this Article


Hello stranger!

You need to Register an InfoQ account or or login to post comments. But there's so much more behind being registered.

Get the most out of the InfoQ experience.

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Community comments

  • Seriously ugly ideas

    by Cameron Purdy,

    Your message is awaiting moderation. Thank you for participating in the discussion.

    When the only tool that you have is a hand-grenade ...

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p

Allowed html: a,b,br,blockquote,i,li,pre,u,ul,p


Is your profile up-to-date? Please take a moment to review and update.

Note: If updating/changing your email, a validation request will be sent

Company name:
Company role:
Company size:
You will be sent an email to validate the new email address. This pop-up will close itself in a few moments.