VAGAS DE EMPREGO

balta.io balta.io
  • Cursos
  • Carreiras
  • Para sua Empresa
  • Livros
    • Background Services
    • Blazor com .NET 8
    • Segurança em APIs
    • Futuro do C# 12
    • Nullable Types
    • Clean Code
  • Blog

Seja Premium
balta.io

  • Cursos
  • Carreiras
  • Para sua Empresa
  • Agenda
  • Livros
    • Background Services
    • Blazor com .NET 8
    • Segurança em APIs
    • Futuro do C# 12
    • Nullable Types
    • Clean Code
  • Blog
  • Player
Seja Premium

Entre ou Cadastre-se

  • Home
  • Artigos
  • Deconstruct no C#


👉 Temos uma versão mais atualizada deste artigo no nosso novo Blog

Deconstruct no C#

O C# conta com um recurso parecido com o do JavaScript onde podemos desconstruir um objeto e obter de forma fácil e simples suas propriedades.

Deconstruct

O primeiro passo é entender o que é o método Deconstruct que não deve ser confundido com o método destrutor do objeto (~Metodo()). O nome deconstruct significa desconstruir, que é exatamente o que queremos aqui.

Nos artigos anteriores falamos sobre métodos de extensão (Extension Methods) e como podemos extender tipos built-in do .NET de forma simples e fácil. O Deconstruct funcionará de forma similar.

Na verdade o Deconstruct deve ser inserido dentro de uma classe de extensão, como fazemos com os Extension Methods, então vamos começar criando uma classe estática que é obrigatória neste caso.


public static class DateTimeExtensions
{
    // ...
}

Implementação

A diferença entre um método de extensão comum e um Deconstruct é o nome deste. Neste caso, o nome obrigatóriamente deve ser Deconstruct, como mostrado abaixo.

public static class DateTimeExtensions
{
    public static void Deconstruct()
    {
        // ...
    }
}

Como pudemos notar, estamos trabalhando em uma extensão para o DateTime, então vamos seguir com o método como se de fato estivessemos escrevendo um Extension Method, que exige um parâmetro de entrada com a palavra this na frente.

public static class DateTimeExtensions
{
    public static void Deconstruct(this DateTime dateTime)
    {
        // ...
    }
}

Além do nome Deconstruct obrigatório, temos que retornar um valor neste método, e aqui vem a parte legal da coisa. O ato de desconstruir um objeto, remete ao desmembramento do mesmo, em variáveis.

Nos artigos anteriores, vimos como trabalhar com Tuplas, que serão utilizadas aqui. Então nada melhor que desmembrar nossa Data/Hora em uma tupla que retorna ano, mês e dia de forma separada.

public static class DateTimeExtensions
{
    public static void Deconstruct(
        this DateTime dateTime, 
        out int year, out int month, out int day)
    {
        // ...
    }
}

Note que fizemos uso da palavra reservada out, uma vez que o método Deconstruct é do tipo void e não tem um retorno específico. Neste caso, o out vai gerar três variáveis para nós, year, month e day, todas como int.

Agora tudo que precisamos fazer é assimilar as variáveis aos valores do DateTime que recebemos como entrada. Estes valores serão automaticamente expostos de forma desconstruída.

public static class DateTimeExtensions
{
    public static void Deconstruct(
        this DateTime dateTime, 
        out int year, out int month, out int day)
    {
        year = dateTime.Year;
        month = dateTime.Month;
        day = dateTime.Day;
    }
}

Melhorando o código

Antes de prosseguir, podemos melhorar nosso código utilizando as Tuplas. Aqui podemos criar um conjunto com os três valores que utilizamos no out e em seguida fazer a assimilação em grupo dos valores do DateTime para estes.

public static class DateTimeExtensions
{
    public static void Deconstruct(
        this DateTime dateTime, 
        out int year, out int month, out int day)
    {
        (year, month, day) = (dateTime.Year, dateTime.Month, dateTime.Day);
    }
}

E claro, para melhorar ainda mais nosso código, como temos apenas uma linha de código no método Deconstruct, podemos torná-lo um Expression Body, usando => e retornando o resultado diretamente.

public static class DateTimeExtensions
{
    public static void Deconstruct(
        this DateTime dateTime, 
        out int year, out int month, out int day)
        => (year, month, day) = (dateTime.Year, dateTime.Month, dateTime.Day);
}

Utilizando o Deconstruct

Para utilizar o Deconstruct, basta assimilar uma Data/Hora a uma variável que seja uma Tupla esperando três valores (Assim como definimos nos out).

var (y, m, d) = DateTime.Now;

Console.WriteLine(y);
Console.WriteLine(m);
Console.WriteLine(d);

Note que o nome das variáveis não importam, tanto que definimos y, m e d para elas. No entando, elas serão assimiladas conforme a ordem dos out, que no nosso caso é year (Ano), month (Mês) e day (Dia).

Desta forma, não adianta inverter a ordem na hora de receber os valores (Como mostrado abaixo), você estará mudando apenas o nome das variáveis (E confundindo outras pessoas). A ordem sempre será ANO-MÊS-DIA conforme definida nos out do Deconstruct.

var (day, year, month) = DateTime.Now;

Console.WriteLine(day);
Console.WriteLine(year);
Console.WriteLine(month);

Particularmente gosto de criar nomes mais intuitivos, mesmo que maiores, então tento nomear as variáveis das tuplas de acordo com os out, tendo como resultado final o código abaixo.

var (year, month, day) = DateTime.Now;

Console.WriteLine(year);
Console.WriteLine(month);
Console.WriteLine(day);

Conclusão

Como pudemos notar, o C# possui inúmeras funcionalidades escondidas e o Deconstruct é uma delas, que pode agregar muito valor e facilitar muito nosso código.

Populares

Priority Queue

Priority Queue ou fila prioritária é um tipo de lista inclusa no C# 10 que permite que seus itens...


Implicit Operators no C#

Implicit Operators permitem adicionar comportamentos de conversão a objetos Built In ou complexos...


ASP.NET 5 – Autenticação e Autorização com Bearer e JWT

Este artigo atualmente utiliza a versão 5.0.0-rc.1 do ASP.NET/.NET, o que significa que ainda não...


Clean Code - Guia e Exemplos

Saiba como manter seu código limpo (Clean Code) seguindo algumas práticas sugeridas pelo Robert C...


Git e GitHub - Instalação, Configuração e Primeiros Passos

Git é um sistema de controle de versões distribuídas, enquanto GitHub é uma plataforma que tem o ...


Compartilhe este artigo



Conheça o autor

André Baltieri

André Baltieri

Microsoft MVP

Me dedico ao desenvolvimento de software desde 2003, sendo minha maior especialidade o Desenvolvimento Web. Durante esta jornada pude trabalhar presencialmente aqui no Brasil e Estados Unidos, atender remotamente times da ?ndia, Inglaterra e Holanda, receber 8x Microsoft MVP e realizar diversas consultorias em empresas e projetos de todos os tamanhos.





3.133

Aulas disponíveis

292

horas de conteúdo

76.461

Alunos matriculados

53.012

Certificados emitidos





Comece de graça agora mesmo!

Temos mais de 21 cursos totalmente de graça e todos com certificado de conclusão.

Começar


Prefere algo mais Premium?

Conheça nossos planos



Premium anual

Compra única, parcelada em até
12x no cartão de crédito


12x R$

99

,79

=R$ 1.197,44
  • 1 ano de acesso
  • Acesso à todo conteúdo
  • Emissão de Certificado
  • Tira Dúvidas Online
  • 67 cursos disponíveis
  • 10 carreiras disponíveis
  • 161 temas de tecnologia
  • Conteúdo novo todo mês
  • Encontros Premium

Começar agora

Política de privacidade



Precisa de ajuda?

Dúvidas frequentes



  • Posso começar de graça?

    Sim! Basta criar sua conta gratuita no balta.io e começar seus estudos. Nós contamos com diversos cursos TOTALMENTE gratuitos e com certificado de conclusão.

  • Vou ter que pagar algo?

    Nós temos cursos gratuitos e pagos, porém você não precisa informar nenhum dado de pagamento para começar seus estudos gratuitamente conosco. Os cursos gratuitos são completos e com certificado de conclusão, você não paga nada por eles.

    Porém, caso queira algo mais Premium , você terá acesso à diversos benefícios que vão te ajudar ainda mais em sua carreira.

  • Por onde devo começar?

    Siga SEMPRE as nossas Carreiras , elas vão te orientar em todos os sentidos. Os cursos já estão organizados em categorias e carreiras para facilitar seu aprendizado.
    Nossa sugestão para aprendizado é começar pelo Backend e seguindo para Frontend e Mobile.

    • Backend
    • Frontend
    • Mobile

  • Os cursos ensinam tudo que preciso?

    Nenhum curso no mundo vai te ensinar tudo, desculpa ser sincero! Os cursos são uma base, eles fornecem por volta de 30% do que você precisa aprender, o resto é com você, com dedicação e MUITA prática.

  • O que eu devo estudar?

    Java ou .NET? Angular ou React? Xamarin ou Flutter? A resposta é simples e direta: "Você já sabe o básico?"

    Se você ainda não sabe BEM o básico, ou seja, os fundamentos, OOP, SOLID, Clean Code, está perdendo tempo estudando Frameworks ou até coisas mais avançadas como Docker. Foque nos seus objetivos primeiro.
    Agora se você está indeciso sobre qual Framework estudar, a boa notícia é que o mercado neste momento está bem aquecido e você tem várias oportunidade. Desta forma o que levaríamos em conta para tomar esta decisão seria:

    • Já sei o básico
    • O Framework/Tecnologia tem mercado onde eu estou (região)
    • O Framework/Tecnologia é utilizado em uma empresa onde quero atual
    • O Framework/Tecnologia resolve meu problema
    • Eu gosto de utilizar o Framework/Tecnologia

  • Estou pronto para estudar no balta.io?

    Com certeza! O primeiro passo é começar e você pode fazer isto agora mesmo!

    Começar de graça

Ainda tem dúvidas?





Assine nosso Newsletter

Receba em primeira mão todas as nossas novidades.

Cadastrar


balta.io

Sobre

  • Como funciona?
  • Seja Premium
  • Agenda
  • Blog
  • Todos os cursos

Cursos

  • Frontend
  • Backend
  • Mobile
  • Fullstack

Suporte

  • Termos de uso
  • Privacidade
  • Cancelamento
  • Central de ajuda

Redes Sociais

  • Telegram
  • Facebook
  • Instagram
  • YouTube
  • Twitch
  • LinkedIn
  • Discord