DEV Community

Bruno Santos
Bruno Santos

Posted on

C# — Operadores implícitos e explícitos

Neste conteúdo, vamos falar sobre operadores implícitos e explícitos em C# e como podemos criar os nossos próprios operadores.

Operadores explícitos

A conversão explícita ocorre quando a conversão de um tipo de dado em outro não é possível de forma direta, sendo então necessário especificar a conversão de maneira explícita no código (cast). Esse tipo de conversão pode resultar na perda de informações ou dados truncados.

double x = 1.77;
int y = (int)x;
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, não é possível realizar a conversão de forma natural do tipo doublepara int, sendo necessário realizar o cast. No exemplo acima teremos perda de dados ao converter o tipo double **para **int.

Operadores implícitos

São aqueles onde o compilador possui a capacidade de converter um determinado tipo de dado em outro sem a necessidade de uma conversão explícita (cast). Na conversão implícita não há perda de dados.

int x = 2023;
double y = x;
Enter fullscreen mode Exit fullscreen mode

No exemplo acima foi possível realizar a conversão de x, do tipo **int **para **double **de forma natural. Vale lembrar que números reais suportam números inteiros.

Sobrecarga de operadores

O C# permite a criação de operadores explícitos e implícitos, porém não é possível redefinir um operador já existente.

public static explicit operator ObjetoDestino(ObjetoOrigem origem)
{
     // lógica de conversão
}

public static implicit operator ObjetoDestino(ObjetoOrigem origem)
{
     // lógica de conversão
}
Enter fullscreen mode Exit fullscreen mode

Definindo um operador explícito

Vamos utilizar como exemplo a conversão entre as unidades grama e quilograma. Abaixo temos a definição das classes e a criação do nosso operador explícito na classe Grama que possui a lógica de conversão para Quilograma.

public class Grama
{
    public int Peso { get; set; }

    public Grama(int peso)
    {
        Peso = peso;
    }

    public static explicit operator Quilograma(Grama grama)
    {
        int peso = grama.Peso / 1000;
        return new Quilograma(peso);
    }
}

public class Quilograma
{
    public int Peso { get; set; }

    public Quilograma(int peso)
    {
        Peso = peso;
    }
}

// Como usar

Grama pesoEmGrama = new Grama(2500);
Quilograma pesoEmQuilograma = (Quilograma)pesoEmGrama;
Enter fullscreen mode Exit fullscreen mode

Definindo um operador implícito

Operadores de conversões implícitas podem ser utilizados, por exemplo, em cenários de conversões de DTOs ou ViewModels para classes do nosso domínio sem a utilização de ferramentas externas como por exemplo o AutoMapper. Abaixo um exemplo de conversão implícita entre nosso DTO e nossa classe de domínio.

public class PessoaDto
{
    public string Nome { get; set; }
    public int Idade { get; set; }
    public string Email { get; set; }

    public static implicit operator Pessoa(PessoaDto pessoa)
    {
        return new Pessoa(pessoa.Nome, pessoa.Idade, pessoa.Email);
    }    
}

public class Pessoa
{
    public Guid Id { get; set; }
    public string Nome { get; set; }
    public int Idade { get; set; }
    public string Email { get; set; }

    public Pessoa(string nome, int idade, string email)
    {
        Id = Guid.NewGuid();
        Nome = nome;
        Idade = idade;
        Email = email;
    }
}

// Como usar

PessoaDto pessoaDto = new PessoaDto()
{
    Email = "contato@medium.com",
    Idade = 25,
    Nome = "Fulano"
};

Pessoa pessoa = pessoaDto;
Enter fullscreen mode Exit fullscreen mode

No exemplo acima podemos efetuar a conversão do nosso DTO em nossa classe de domínio de forma natural.

Conclusão

A sobrecarga de operadores implícitos e explícitos é um recurso poderoso que pode tornar nossos códigos mais expressivos e fáceis de usar, porém nada está escrito em pedra e nenhuma solução é ideal para todos os projetos. Devemos sempre analisar o cenário, como o time trabalha, além de levantar os impactos que podem surgir em sua adoção.

Fontes

Operadores de conversão explícitos e implícitos definidos pelo usuário

Top comments (0)