Closures em C#

C# 1 Reply

!!! Não considerem uma boa prática, utilizem a caráter de conhecimento !!!

Uma coisa bacana é o conceito de closures, em outras linguagens, que nada mais é do que conter uma função dentro de outra, fazendo seu fechamento para o escopo externo. Em javascript é uma prática comum, como no pedaço abaixo:

Neste código, utilizamos esta prática para isolar o nosso código do escopo externo, garantindo não “sujar” o ambiente com funções jogadas e garantir que “$” seja um alias para o jQuery, que pode até ser substituído por uma biblioteca alternativa, como o Zepto, por exemplo.

No caso do C#, podemos fazer algo muito parecido, declarando funções dentro dos métodos, utilizando 2 modelos:

  • Action -> função que recebe um parâmetro e não retorna nada;
  • Func -> função que recebe N parâmetros e retorna 1 valor;

Bom, começando pela Action, ela pode ser útil para alterar um objeto, lembrando que eles são sempre passados como referência e que, neste caso, sua modificação dentro da nossa função seria reproduzida externamente. O código ficaria assim:

Vemos que, neste caso, “modificaTeste” serve apenas para alterar o valor interno de teste.

Já no outro perfil, temos Func<>, que é, particularmente, muito mais divertido. Com ele, trabalhamos pensando que a última definição é sempre o tipo de retorno, portanto Func<int, string> receberá um int e retornará uma string, enquanto Func<int> não receberá parâmetros, retornando apenas um int. Vejamos o código como fica:

“eMaiorDeIdade” poderá ser utilizada em todo escopo da função que for declarada e executará sua atividade normalmente.

Mas para que utilizar isto?

Eu, particularmente utilizo este tipo de truque quando meu método reutiliza muito uma ação que não precisa ser declarado na classe, ou, mais comumente, quando minha view precisa MUITO (veja bem, muito mesmo) de uma execução bem específica e não será reutilizada afora, declaro minhas funções e utilizo com o Razor.

Bom, desta maneira é possível declarar funções dentro de funções e as mesmas estarem fechadas para o escopo externo, deixando claro que o uso é bem específico e se alguém for utilizar, lembre com carinho do resto da equipe.

Até mais,

One thought on “Closures em C#

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *