Funções locais

Em inglês são chamadas de Local Functions, um recurso disponível a partir do C# 7.0.

Já aprendemos sobre a chamada de métodos. Dentro do bloco de código de um método, é possível invocar outros métodos, seguindo estas regras:

  • Métodos dentro da mesma classe: basta informar o nome do método e passar os parâmetros para chamá-lo;
  • Métodos de outra classe: primeiro é preciso criar uma instância da classe correspondente e o método de destino deve estar marcado com o modificador public.

A partir do C# 7.0, podemos definir funções independentes diretamente dentro de um método. Elas recebem o nome defunções locais:

  1. Isolamento: só podem ser chamadas de dentro do método externo que as contém; códigos externos não conseguem acessá-las;
  2. Vantagens: o código relacionado fica agrupado, melhora a legibilidade e facilita a manutenção;
  3. Regra de declaração: diferente de variáveis locais, funções locais podem ser declaradas em qualquer trecho do método externo, sem necessidade de declaração antecipada.

Funções locais conseguem capturar variáveis locais do método externo, mas seu escopo fica restrito ao método que as envolve.


Vamos complementar um conceito fundamental:

Variáveis locais dentro de uma função são executadas de cima para baixo. A variável deve ser declarada antes do uso; não funciona na ordem inversa.

Veja o código abaixo como exemplo: a variável hour é criada posteriormente, então não podemos acessá-la antes de sua definição.

    int GetHours()
    {
        Console.WriteLine(hour);
        int hour = DateTime.Now.Hour;
        return hour;
    }Code language: C# (cs)

Mesmo que o escopo de hour cubra todo o corpo do método, não é permitido usá-la antes de declará-la.

Aparecerá um erro com uma linha ondulada vermelha, a mensagem de erro está ilustrada na imagem acima.

Isso é diferente dos métodos. Um método declarado mais abaixo pode ser invocado por um código acima. Métodos de classe são membros da classe e são armazenados na Method Table (tabela de métodos). Na hora da chamada, o sistema consulta essa tabela, não segue uma execução sequencial de cima para baixo.

No trecho abaixo, o método Main no topo chama o GetHours declarado depois. Esse comportamento se distingue das regras para declaração e uso de variáveis locais.

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.GetHours();
    }

    int GetHours()
    {
        int hour = DateTime.Now.Hour;
        return hour;
    }
}Code language: C# (cs)

Voltemos ao assunto das funções locais.

Confira o exemplo:



class Program
{
    static void Main()
    {
        Program program = new Program();
        program.ZoomIn();
    }

    public void ZoomIn()
    {
        // É possível chamar a função local antes de declará-la
        int results0 = ZoomIn5(10);
        Console.WriteLine($"A: {results0}");

        // Função local: multiplica o valor recebido val por 5 e retorna o resultado
        int ZoomIn5(int val)
        {
            return val * 5;
        }

        // Chamada da função local
        int results = ZoomIn5(10);
        Console.WriteLine($"B: {results}");

        int results2 = ZoomIn5(5);
        Console.WriteLine($"C: {results2}");
    }
}
Code language: C# (cs)

O escopo de uma função local está restrito ao método que a contém. Você consegue chamá-la tanto antes quanto depois da sua declaração dentro desse método.

Além disso, o nome da função local pode ser igual ao nome do método externo que a contém.



class Program
{
    static void Main()
    {
        Program program = new Program();
        program.ZoomIn5();
    }

    public void ZoomIn5()
    {
        // É possível chamar a função local antes de declará-la
        int results0 = ZoomIn5(10);
        Console.WriteLine($"A: {results0}");

        // Função local: multiplica o valor recebido val por 5 e retorna o resultado
        int ZoomIn5(int val)
        {
            return val * 5;
        }

        // Chamada da função local
        int results = ZoomIn5(10);
        Console.WriteLine($"B: {results}");

        int results2 = ZoomIn5(5);
        Console.WriteLine($"C: {results2}");
    }
}
Code language: C# (cs)

No exemplo acima, tanto o método externo quanto a função local têm o nome ZoomIn5. Não há conflito de nomes pois seus escopos são diferentes, mas não é recomendado adotar essa forma de escrita.

Funções locais

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *