Código Central – Blog
Aprenda C#

Assinaturas e Sobrecarga em C#

Ilustração representando assinaturas e sobrecarga de métodos em C#, com exemplos de métodos sobrecarregados e diferentes modificadores como ref, in, e out, em um ambiente de programação moderno.

Em C#, o conceito de assinatura é fundamental para a diferenciação entre métodos, construtores, indexadores e operadores, e permite a sobrecarga dessas funções. A sobrecarga é a capacidade de declarar vários métodos com o mesmo nome, mas com assinaturas diferentes, dentro de uma classe, struct ou interface. Neste artigo, vamos explorar como funcionam as assinaturas e a sobrecarga de membros em C#.

O Que é uma Assinatura?

Uma assinatura é uma combinação de elementos que identifica de maneira única um membro em C#. Para métodos, construtores, indexadores e operadores, a assinatura é composta pelos seguintes elementos:

Um ponto importante é que as assinaturas não incluem o tipo de retorno, nomes de parâmetros, modificadores como params ou this, nem se os parâmetros são opcionais.

Exemplo de Sobrecarga de Métodos

A sobrecarga de métodos permite que múltiplos métodos com o mesmo nome sejam declarados, desde que suas assinaturas sejam únicas. Aqui está um exemplo:

class Calculadora
{
    public int Somar(int x, int y) => x + y; // Somar(int, int)
    public double Somar(double x, double y) => x + y; // Somar(double, double)
    public int Somar(int x, int y, int z) => x + y + z; // Somar(int, int, int)
}

Neste exemplo, o método Somar foi sobrecarregado três vezes, cada um com uma assinatura única. A assinatura dos métodos inclui o número e os tipos de parâmetros.

Regras de Sobrecarga

Em C#, é permitido sobrecarregar métodos, construtores, indexadores e operadores, desde que suas assinaturas sejam distintas. No entanto, algumas regras importantes se aplicam:

Sobrecarga de Construtores

A sobrecarga de construtores segue as mesmas regras dos métodos. Vários construtores podem ser declarados, desde que tenham assinaturas diferentes.

class Pessoa
{
    public string Nome;
    public int Idade;

    public Pessoa(string nome) // Construtor 1
    {
        Nome = nome;
    }

    public Pessoa(string nome, int idade) // Construtor 2
    {
        Nome = nome;
        Idade = idade;
    }
}

Aqui, a classe Pessoa tem dois construtores sobrecarregados, um que aceita apenas o nome e outro que aceita o nome e a idade.

Sobrecarga de Operadores

Operadores também podem ser sobrecarregados, desde que suas assinaturas sejam únicas. Aqui está um exemplo:

class Complexo
{
    public int Real;
    public int Imaginario;

    public static Complexo operator +(Complexo c1, Complexo c2) => 
        new Complexo { Real = c1.Real + c2.Real, Imaginario = c1.Imaginario + c2.Imaginario };

    public static Complexo operator -(Complexo c1, Complexo c2) => 
        new Complexo { Real = c1.Real - c2.Real, Imaginario = c1.Imaginario - c2.Imaginario };
}

Aqui, os operadores + e - foram sobrecarregados para a classe Complexo.

Conclusão

As assinaturas são a base da sobrecarga de membros em C#. Sobrecargas permitem que diferentes versões de métodos, construtores, indexadores e operadores sejam criadas, contanto que suas assinaturas sejam distintas. É importante entender as regras de sobrecarga para garantir que o código esteja correto e funcione conforme esperado.

Posts relacionados

Membros em C#: Explorando Tipos e Estruturas

Diogo
1 semana atrás

Tokens em C#: A Base da Análise Lexical

Diogo
2 semanas atrás

Gerenciamento Automático de Memória no C#: Entendendo o Coletor de Lixo

Diogo
1 semana atrás
Sair da versão mobile