Partilhar via


Funções anónimas estáticas

Observação

Este artigo é uma especificação de recurso. A especificação serve como o documento de design para o recurso. Ele inclui mudanças de especificação propostas, juntamente com as informações necessárias durante o design e desenvolvimento do recurso. Estes artigos são publicados até que as alterações de especificações 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 Language Design Meeting (LDM).

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

Questão campeã: https://github.com/dotnet/csharplang/issues/275

Resumo

Permitir um modificador 'estático' em lambdas e métodos anónimos, que impede a captura de variáveis locais ou estado de instância das extensões envolventes.

Motivação

Evite capturar involuntariamente o estado do contexto envolvente, o que pode resultar em retenção inesperada de objetos capturados ou alocações adicionais inesperadas.

Projeto detalhado

Um método lambda ou anônimo pode ter um modificador de 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 que o encerra. Como resultado, locais, parâmetros e this do escopo que encerra não estão disponíveis numa função estática anônima .

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

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

Uma função anónima estática pode fazer referência a definições de constant a partir do âmbito de aplicação.

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

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

Não é dada qualquer garantia sobre se uma função anónima estática definição é emitida como um método static em metadados. Isso é deixado para a implementação do compilador para otimizar.

Uma função local nãostatic ou uma função anónima pode capturar o estado de uma função anónima estática mas não pode capturar o estado fora da função anónima de inclusão estática.

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