Udostępnij za pośrednictwem


Statyczne funkcje anonimowe

Notatka

Ten artykuł jest specyfikacją funkcji. Specyfikacja służy jako dokument projektowy dla funkcji. Zawiera proponowane zmiany specyfikacji wraz z informacjami wymaganymi podczas projektowania i opracowywania funkcji. Te artykuły są publikowane do momentu sfinalizowania proponowanych zmian specyfikacji i włączenia ich do obecnej specyfikacji ECMA.

Mogą wystąpić pewne rozbieżności między specyfikacją funkcji a ukończoną implementacją. Te różnice są uwzględnione w odpowiednich notatkach ze spotkania projektowego języka (LDM) .

Więcej informacji na temat procesu wdrażania specyfikacji funkcji można znaleźć w standardzie języka C# w artykule dotyczącym specyfikacji .

Kwestia mistrza: https://github.com/dotnet/csharplang/issues/275

Streszczenie

Zezwalaj na modyfikator "statyczny" w wyrażeniach lambda i metodach anonimowych, które nie pozwalają na przechwytywanie zmiennych lokalnych lub stanu wystąpienia z zewnętrznych zakresów.

Motywacja

Unikaj niezamierzonego przechwytywania stanu z otaczającego kontekstu, co może spowodować nieoczekiwane przechowywanie przechwyconych obiektów lub nieoczekiwane dodatkowe alokacje.

Szczegółowy projekt

Metoda lambda lub anonimowa może mieć modyfikator static. Modyfikator static wskazuje, że metoda lambda lub anonimowa jest statyczną funkcją anonimową.

Funkcja statyczna anonimowa nie może przechwycić stanu z otaczającego zakresu. W związku z tym zmienne lokalne, parametry i this z zakresu otaczającego nie są dostępne w statycznej funkcji anonimowej .

Statyczna funkcja anonimowa nie może odwoływać się do składowych instancji z niejawnego ani jawnego this lub base odwołania.

Anonimowa funkcja statyczna może odwoływać się do członków static z otaczającego zakresu.

Statyczna funkcja anonimowa może odwoływać się do definicji constant z otaczającego zakresu.

nameof() w statycznej anonimowej funkcji może odwoływać się do zmiennych lokalnych, parametrów lub this lub base z otaczającego zakresu.

Reguły ułatwień dostępu dla elementów członkowskich private w zakresie otaczającym są takie same w przypadku funkcji static i innych niżstatic anonimowych.

Nie ma gwarancji, czy statycznej funkcji anonimowej definicji jest emitowana jako metoda static w metadanych. Jest to pozostawione do implementacji kompilatora w celu optymalizacji.

Funkcja lokalna lub funkcja anonimowa niestatic może przechwytywać stan z otaczającej statycznej funkcji anonimowej, ale nie może przechwycić stanu poza otaczającą statyczną funkcją anonimową.

Usunięcie modyfikatora static z funkcji anonimowej w prawidłowym programie nie zmienia znaczenia programu.