Dela via


Statiska anonyma funktioner

Obs

Den här artikeln är en funktionsspecifikation. Specifikationen fungerar som designdokument för funktionen. Den innehåller föreslagna specifikationsändringar, tillsammans med information som behövs under utformningen och utvecklingen av funktionen. Dessa artiklar publiceras tills de föreslagna specifikationsändringarna har slutförts och införlivats i den aktuella ECMA-specifikationen.

Det kan finnas vissa skillnader mellan funktionsspecifikationen och den slutförda implementeringen. Dessa skillnader återspeglas i de relevanta anteckningarna från LDM (Language Design Meeting).

Du kan läsa mer om processen för att införa funktionsspecifikationer i C#-språkstandarden i artikeln om specifikationerna.

Champion-fråga: https://github.com/dotnet/csharplang/issues/275

Sammanfattning

Tillåt en "statisk" modifierare på lambdas och anonyma metoder, vilket förhindrar att lokala variabler eller instansvariabler från de omgivande omfången fångas.

Motivation

Undvik att oavsiktligt fånga tillståndsdata från den omgivande kontexten, vilket kan resultera i att objekten hålls kvar oväntat eller att ytterligare allokeringar sker.

Detaljerad design

En lambda- eller anonym metod kan ha en static modifierare. static-modifieraren anger att lambda- eller anonym-metoden är en statisk anonym funktion.

En statisk anonym funktion kan inte fånga tillstånd från det omgivande omfånget. Det innebär att lokaler, parametrar och this från det omslutande omfånget inte är tillgängliga i en statisk anonym funktion.

En statisk anonym funktion kan inte referera till instansmedlemmar från en implicit eller explicit this eller base referens.

En statisk anonym funktion kan referera till static medlemmar i det omgivande omfånget.

Ett statiskt anonymt funktionsuttryck kan referera till constant definitioner från det omgivande omfånget.

nameof() i en statisk anonym funktion kan referera till lokala variabler, parametrar eller this eller base från det omslutande omfånget.

Åtkomsträttigheterna för medlemmar i private i det omslutande scope är de samma för static och icke-static anonyma funktioner.

Det finns ingen garanti för om en statisk anonym funktion definition genereras som en static metod i metadata. Detta är upp till kompilatorimplementeringen att optimera.

En icke-static lokal funktion eller anonym funktion kan avbilda tillstånd från en omslutande statisk anonym funktion men kan inte avbilda tillstånd utanför den omslutande statiska anonyma funktionen.

Om du tar bort static-modifieraren från en anonym funktion i ett giltigt program ändras inte programmets innebörd.