CodeGym /Cursos /C# SELF /Funções Locais

Funções Locais

C# SELF
Nível 11 , Lição 4
Disponível

1. Introdução

Todo programador sabe: funções (ou métodos) são basicamente os "burros de carga" de qualquer app. Elas ajudam a gente a estruturar o código, reaproveitar lógica e não se afogar em infinitos ctrl+c/ctrl+v. Até agora, todas as funções que você usou eram "vizinhas" dentro do corpo da classe ou struct.

Mas imagina que você tem uma função grandona com um pedaço de lógica não tão grande assim, que você queria separar de um jeito organizado, sem mostrar pro projeto inteiro. Tipo um cálculo auxiliar dentro de um método, que não serve pra mais nada.

Nessa hora, as funções locais salvam o rolê.

Função local é uma função declarada dentro de outra função (método, construtor, propriedade ou até outra função local). E essa função local só é visível pro "pai" dela e mais ninguém.

Sintaxe das funções locais


void MainMethod()
{
    Console.WriteLine("Iniciando o método principal.");            // Начало работы основного метода.
    int result = InnerSum(5, 7);                              // Вызов локальной функции InnerSum (внутренняя сумма)
    Console.WriteLine($"Resultado da função local: {result}");    // Результат локальной функции: {result}

    // Função local declarada direto dentro de MainMethod
    
  
int InnerSum(int a, int b) // Função local pra somar dois números { return a + b; // Retorna a soma de a e b }
}

Nesse exemplo, a função InnerSum foi declarada direto dentro do método MainMethod. Ela não aparece fora do método principal — de jeito nenhum! Tipo uma instrução secreta que só pode ser compartilhada no privado.

2. Como declarar e onde usar funções locais

Regras básicas

  • Função local pode ser declarada dentro de: método, construtor, propriedade, operador ou até outra função local!
  • Função local só é visível no seu próprio scope (escopo).
  • Funções locais podem ser chamadas antes ou depois da declaração dentro da função pai (C# já analisa tudo antes).

Exemplo: cálculo da média das notas


// Função principal pra imprimir a média das notas
void PrintAverageScore(int[] scores)
{
    if (scores.Length == 0)
    {
        Console.WriteLine("Sem notas pra calcular."); // No scores to calculate.
        return;
    }

    double average = CalculateAverage(scores);
    Console.WriteLine($"Média das notas: {average:0.00}"); // Average score

    // Função local pra calcular a média
    
  
double CalculateAverage(int[] arr) { int sum = 0; foreach (var score in arr) sum += score; return (double)sum / arr.Length; // Retorna a média }
} // Chamando a função: int[] myScores = { 5, 4, 3, 4, 5 }; PrintAverageScore(myScores); // Vai mostrar: Média das notas: 4.20

Viu como é prático? Ninguém fora do PrintAverageScore consegue usar a lógica interna dela — a função local CalculateAverage. Assim o código fica organizado e você não polui o namespace global com métodos auxiliares.

3. Funções locais e escopo (scope)

O grande lance das funções locais é que o escopo delas fica limitado ao método "pai". Isso evita que a classe fique cheia de métodos pequenos que só servem pra um lugar.


+-----------------+
|   Método da classe  |
|    void Foo()   |
|                 |
|   +-----------+ |
|   |  Função   | |
|   |  local    | |
|   +-----------+ |
+-----------------+
Função local só existe dentro do método onde foi declarada

Função local existe somente dentro do método onde foi declarada. Tentar acessar ela de fora é tipo tentar ligar pra um número secreto que você nem tem.

Se você tentar chamar uma função local fora do método pai, vai tomar erro de compilação: Nome '...' não existe no contexto atual.

Funções locais enxergam as variáveis do pai

Funções locais podem acessar todas as variáveis do método pai — essa é a superpoder delas!


void ShowStudent(string name, int age)
{
    string message = BuildMessage();
    Console.WriteLine(message);

    // Função local usando as variáveis "name" e "age"
    
  
string BuildMessage() { return $"Nome: { name}, Idade: { age}"; }
}

Isso deixa o código não só mais curto, mas também menos "barulhento". Não precisa passar dez parâmetros pra cada método — a função local "enxerga" tudo que tem no pai.

4. Funções locais dentro de loops e condições

Você pode declarar funções locais em qualquer nível de aninhamento — até dentro de loops ou ifs:


void ProcessNumbers(int[] numbers)
{
    foreach (int number in numbers)
    {
        if (number % 2 == 0)
        {
            Console.WriteLine($"{number} — par");
            PrintEvenMessage();
        }
        else
        {
            Console.WriteLine($"{number} — ímpar");
        }

        
  
void PrintEvenMessage() { Console.WriteLine("Esse número é par, parabéns!"); }
} }

Mas esse jeito pode deixar o código confuso rapidinho, principalmente se tiver muita função local ou se elas forem grandes. Não exagera, mas é bom saber que dá pra fazer.

Função local vs método privado normal

Critério Função local Método privado da classe
Escopo Só a função pai A classe toda
Acesso às variáveis do pai Sim Não (só via parâmetros)
Facilidade de leitura Alta Média
Potencial de reuso Baixo Alto
Testabilidade Difícil de testar Fácil de testar

5. Erros comuns e particularidades

Erro nº1: digitar errado ou esquecer de declarar a função local.
Se você chamar uma função local com nome errado ou esquecer de declarar, o compilador vai avisar com erro CS0103 ou CS0128, e o código não compila.

Erro nº2: mudar variáveis capturadas (closure).
Quando a função local muda o valor de uma variável do método externo, pode dar um resultado bem diferente do esperado — variáveis capturadas se comportam como cópias ou referências, e mudar elas afeta a lógica.

Erro nº3: ignorar dicas da IDE pra transformar métodos privados.
Se você deixa métodos privados desnecessários na classe, mesmo quando a IDE (tipo o Rider) sugere virar função local, o código vira uma bagunça rapidinho e fica difícil de ler.

Erro nº4: aninhar funções locais demais.
Função local demais, uma dentro da outra, dificulta entender e debugar o código. Código enxuto é vida!

2
Tarefa
C# SELF, nível 11, lição 4
Bloqueado
Uso de função local para calcular a soma de dois números
Uso de função local para calcular a soma de dois números
2
Tarefa
C# SELF, nível 11, lição 4
Bloqueado
Função local para verificar se um número é par
Função local para verificar se um número é par
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION