Compartilhar via


Funções anônimas estáticas

Nota

Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ele inclui alterações de especificação propostas, juntamente com as informações necessárias durante o design e o desenvolvimento do recurso. Esses artigos são publicados até que as alterações de especificação propostas sejam finalizadas e incorporadas na especificação ECMA atual.

Pode haver algumas discrepâncias entre a especificação do recurso e a implementação concluída. Essas diferenças são capturadas nas notas pertinentes da reunião de design de idioma (LDM).

Você pode saber mais sobre o processo de adoção de speclets de recursos no padrão de linguagem C# no artigo sobre as especificações de .

Problema do especialista: https://github.com/dotnet/csharplang/issues/275

Resumo

Permitir um modificador "estático" em lambdas e métodos anônimos, o que impede a captura de variáveis locais ou estados de instância de conter escopos.

Motivação

Evite capturar estado de maneira não intencional do contexto delimitador, pois pode resultar na retenção inesperada de objetos capturados ou em alocações adicionais inesperadas.

Design detalhado

Um método lambda ou anônimo pode ter um modificador static. O modificador static indica que o método lambda ou anônimo é uma função anônima estática .

Uma função anônima estática não pode capturar o estado do escopo delimitador. Como resultado, locais, parâmetros e this do escopo delimitador não estão disponíveis em uma função anônima estática.

Uma função anônima estática não pode referenciar membros de instância a partir de uma referência implícita ou explícita, seja this ou base.

Uma função anônima estática pode fazer referência a static membros do escopo delimitador.

Uma função anônima estática pode fazer referência a constant definições do escopo delimitador.

nameof() em uma função anônima estática pode fazer referência a locais, parâmetros ou this ou base do escopo delimitador.

As regras de acessibilidade para membros private no escopo delimitador são as mesmas para funções anônimas static e não static.

Nenhuma garantia é dada quanto à possibilidade de uma definição de função anônima estática ser emitida como um método static no metadata. Isso é deixado para a implementação do compilador otimizar.

Uma função local que não sejastatic ou uma função anônima pode capturar o estado de uma função anônima estática envolvente , mas não pode capturar o estado fora da função anônima estática envolvente .

Remover o modificador de static de uma função anônima em um programa válido não altera o significado do programa.