<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felipe Figueiredo Amorim</title>
    <description>The latest articles on DEV Community by Felipe Figueiredo Amorim (@felipeamorimdev).</description>
    <link>https://dev.to/felipeamorimdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1508468%2Fe7f89ecd-a106-4961-aaa1-2634f5b328ba.jpeg</url>
      <title>DEV Community: Felipe Figueiredo Amorim</title>
      <link>https://dev.to/felipeamorimdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipeamorimdev"/>
    <language>en</language>
    <item>
      <title>O que é Lazy Loading?</title>
      <dc:creator>Felipe Figueiredo Amorim</dc:creator>
      <pubDate>Wed, 23 Oct 2024 19:40:31 +0000</pubDate>
      <link>https://dev.to/felipeamorimdev/o-que-e-lazy-loading-g1i</link>
      <guid>https://dev.to/felipeamorimdev/o-que-e-lazy-loading-g1i</guid>
      <description>&lt;p&gt;💡 O que é Lazy Loading?&lt;/p&gt;

&lt;p&gt;Lazy loading é uma técnica de otimização que carrega recursos de uma página somente quando eles são realmente necessários. Ao invés de carregar todo o conteúdo de uma vez, imagens, vídeos ou scripts são carregados conforme o usuário rola a página ou interage com ela.&lt;/p&gt;

&lt;p&gt;🔍 Por que usar Lazy Loading?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Melhor performance: Carrega apenas o que é visível, inicialmente reduz o tempo de carregamento da página, proporcionando uma experiência mais rápida e fluida.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Economiza banda de rede: Evita carregar recursos que talvez o usuário nem veja, economizando dados, o que é excelente para dispositivos móveis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Melhor SEO: O Google valoriza sites rápidos e bem otimizados, melhorando o ranqueamento da sua página nos resultados de pesquisa.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✅ Prós:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Carregamento inicial mais rápido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Redução de uso de banda e recursos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Melhor experiência do usuário (UX) em dispositivos com conexões mais lentas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;❌ Contras:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Implementação pode ser complexa em projetos maiores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Potenciais problemas com SEO se mal configurado (ex.: indexação de imagens).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alguns navegadores mais antigos podem não suportar essa técnica adequadamente.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;🔧 Como usar Lazy Loading no seu site?&lt;/p&gt;

&lt;p&gt;HTML5 nativo: Adicione o atributo loading="lazy" em imagens e iframes diretamente no seu HTML.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;img src="image.jpg" loading="lazy" alt="Imagem com Lazy Loading"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;💻 Exemplo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://japanjourney.netlify.app" rel="noopener noreferrer"&gt;
      japanjourney.netlify.app
    &lt;/a&gt;
&lt;/div&gt;






&lt;p&gt;🔧 Conclusão: &lt;/p&gt;

&lt;p&gt;O lazy loading é uma ferramenta poderosa para otimizar sites e aplicações, especialmente em tempos de maior foco na experiência do usuário e velocidade de carregamento. Ao usá-lo corretamente, você pode deixar seu Website mais rápido e otimizado.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontend</category>
      <category>performance</category>
      <category>ux</category>
    </item>
    <item>
      <title>Métodos Assíncronos: Uma Abordagem no Desenvolvimento de Software.</title>
      <dc:creator>Felipe Figueiredo Amorim</dc:creator>
      <pubDate>Tue, 03 Sep 2024 05:36:55 +0000</pubDate>
      <link>https://dev.to/felipeamorimdev/metodos-assincronos-uma-abordagem-no-desenvolvimento-de-software-3l0g</link>
      <guid>https://dev.to/felipeamorimdev/metodos-assincronos-uma-abordagem-no-desenvolvimento-de-software-3l0g</guid>
      <description>&lt;h1&gt;Métodos Assíncronos: Conceitos, Aplicações e Boas Práticas&lt;/h1&gt;

&lt;p&gt;No desenvolvimento de software, a eficiência e a responsividade são fundamentais para a criação de aplicações robustas e de alto desempenho. Com o aumento da complexidade das aplicações e a necessidade de interagir com múltiplos recursos simultaneamente, para isso, os métodos assíncronos desempenham um papel fundamental. Eles permitem que operações demoradas, como acesso a banco de dados, requisições HTTP, ou leitura de arquivos, sejam realizadas sem bloquear a execução do restante do programa.
Neste artigo, vamos explorar o conceito de métodos assíncronos, seus benefícios, como implementá-los em .Net, e boas práticas para utilizá-los de maneira eficiente.&lt;/p&gt;




&lt;h2&gt;O que são Métodos Assíncronos?&lt;/h2&gt;

&lt;p&gt;Métodos assíncronos são funções ou procedimentos que permitem a execução de tarefas de forma que a execução do código não seja bloqueada. Em vez de esperar que uma operação seja concluída antes de prosseguir para a próxima linha de código, métodos assíncronos permitem que a aplicação continue executando outras tarefas enquanto aguarda a finalização da operação inicial. Essa abordagem é especialmente útil para operações de I/O (_Input_/_Output_), onde a latência pode impactar significativamente o desempenho da aplicação.&lt;/p&gt;




&lt;h2&gt;Sincronismo vs. Assincronismo&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Métodos Síncronos:&lt;/strong&gt; Executam tarefas de forma sequencial, bloqueando a execução até que cada operação seja concluída. Isso pode levar a ineficiências, especialmente em aplicações que dependem de múltiplas operações demoradas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Métodos Assíncronos:&lt;/strong&gt; Permitem a execução de múltiplas operações de forma concorrente, sem bloquear a execução principal. Isso resulta em uma aplicação mais responsiva.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;Benefícios dos Métodos Assíncronos&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Melhor Desempenho e Escalabilidade:&lt;/strong&gt; Ao liberar o thread principal para continuar executando outras tarefas, métodos assíncronos permitem que as aplicações atendam a mais solicitações simultaneamente sem a necessidade de aumentar os recursos de hardware proporcionalmente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maior Responsividade:&lt;/strong&gt; Em aplicações com interfaces de usuário, operações assíncronas garantem que a interface permaneça responsiva, evitando congelamentos enquanto operações demoradas são processadas em segundo plano.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eficiência no Uso de Recursos:&lt;/strong&gt; Métodos assíncronos permitem um melhor gerenciamento de recursos, já que threads não ficam ociosas aguardando a conclusão de operações que possam bloquear o código.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;C# (.NET)&lt;/h2&gt;

&lt;p&gt;Em C#, a implementação de métodos assíncronos é feita utilizando &lt;em&gt;async&lt;/em&gt; e &lt;em&gt;await&lt;/em&gt;. Esta abordagem melhora a legibilidade e a manutenibilidade do código.&lt;/p&gt;

&lt;h4&gt;Exemplo em C#:&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public async Task&amp;lt;string&amp;gt; GetDataAsync() 
{ 
    using (var client = new HttpClient()) 
    {
       var response = await 
       client.GetStringAsync("https://api.exemplo.com/data"); return 
       response; 
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;Casos de Uso Comuns&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Requisições HTTP:&lt;/strong&gt; Um dos principais usos dos métodos assíncronos é lidar com requisições web, onde o tempo de resposta pode variar bastante. Utilizar operações assíncronas permite que o programa continue sua execução enquanto a resposta do servidor é processada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operações de I/O:&lt;/strong&gt; Leitura e escrita em arquivos, acesso a banco de dados ou operações com sistemas de arquivos em rede podem ser demoradas, essas situações são excelentes para assincronismo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Processamento em paralelo:&lt;/strong&gt; Em tarefas que exigem processamento intenso e podem ser divididas em blocos independentes, métodos assíncronos permitem a execução paralela, aumentando a performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;Boas Práticas ao Usar Métodos Assíncronos&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Evite bloqueios desnecessários:&lt;/strong&gt; Mesmo em um código assíncrono, o uso de funções que bloqueiam o fluxo, como sleep ou operações síncronas dentro de blocos assíncronos, pode comprometer o desempenho.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gerencie exceções:&lt;/strong&gt; Sempre capture exceções em métodos assíncronos. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cuidado com concorrência:&lt;/strong&gt; Em operações que envolvem acesso a recursos compartilhados, como variáveis globais ou bancos de dados, a concorrência pode ser um problema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Otimize o número de tarefas simultâneas:&lt;/strong&gt; Executar muitas tarefas assíncronas ao mesmo tempo pode sobrecarregar o sistema, causando lentidão e perda de desempenho. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use assincronia onde for necessário:&lt;/strong&gt; Nem todas as operações precisam ser assíncronas. Evite complexidade desnecessária em áreas do código onde o benefício não é claro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mantenha o Código Limpo e Modular:&lt;/strong&gt; Estruture o código de forma modular, separando lógica assíncrona em funções distintas para melhorar a legibilidade e manutenção.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trate Erros Adequadamente:&lt;/strong&gt; Implemente mecanismos robustos de tratamento de erros para capturar e gerenciar exceções que possam ocorrer durante operações assíncronas.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;Desafios&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Apesar dos benefícios, a programação assíncrona apresenta alguns desafios:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complexidade do Código:&lt;/strong&gt; A lógica assíncrona pode ser mais difícil de entender e manter, especialmente quando envolve múltiplas operações encadeadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tratamento de Erros:&lt;/strong&gt; Gerenciar erros em ambientes assíncronos requer cuidados adicionais para garantir que todas as exceções sejam tratadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Depuração:&lt;/strong&gt; Ferramentas de depuração podem ser menos eficazes em ambientes assíncronos, tornando mais difícil identificar e resolver problemas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Concorrência e Sincronização:&lt;/strong&gt; A gestão de recursos compartilhados entre operações assíncronas pode levar problemas de lentidão.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Os métodos assíncronos são uma ferramenta poderosa no desenvolvimento de software moderno, proporcionando melhorias significativas em desempenho, escalabilidade e responsividade das aplicações. Ao adotar práticas assíncronas, desenvolvedores podem criar sistemas mais eficientes e capazes de lidar com as demandas crescentes de operações simultâneas. Contudo, é essencial abordar os desafios associados com cuidado, implementando estratégias eficazes de tratamento de erros, modularização e testes para garantir a robustez e a manutenibilidade das soluções desenvolvidas.
À medida que a tecnologia evolui, a programação assíncrona continuará a desempenhar um papel crucial na construção de aplicações resilientes e de alto desempenho, tornando-se uma competência indispensável para desenvolvedores que buscam excelência em suas criações.&lt;/p&gt;

&lt;h3&gt;Referências&lt;/h3&gt;

&lt;p&gt;Microsoft Docs - Async Programming in C#: &lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/asynchronous-programming/async-scenarios" rel="noopener noreferrer"&gt;C# Async&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>dotnet</category>
      <category>csharp</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Classes e Objetos em C# .NET</title>
      <dc:creator>Felipe Figueiredo Amorim</dc:creator>
      <pubDate>Thu, 23 May 2024 21:20:14 +0000</pubDate>
      <link>https://dev.to/felipeamorimdev/classes-e-objetos-em-c-net-1l54</link>
      <guid>https://dev.to/felipeamorimdev/classes-e-objetos-em-c-net-1l54</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Neste artigo vamos falar sobre o conceito de classes em C# (C-Sharp), abordando os temas, fundamentos, características e aplicações. As classes são elementos fundamentais da orientação a objetos, são elas que fornecem a estrutura básica dos objetos.&lt;/p&gt;

&lt;p&gt;Vamos discutir as definições de classes, seus componentes, propriedades, métodos e seus construtores, falaremos também sobre seus conceitos, como herança, polimorfismo e encapsulamento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;A programação orientada a objetos (POO) é um modelo muito utilizado no desenvolvimento de software. C# (C-Sharp) é uma linguagem de programação desenvolvida pela Microsoft, baseado em C e C++, é uma linguagem orientada a objetos e fortemente tipada, onde o framework .NET (dotNET) e parte integrante da linguagem.&lt;/p&gt;

&lt;p&gt;Este artigo vamos falar de uma forma mais abrangente sobre classes, abordando conceitos básicos até os mais avançados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes
&lt;/h2&gt;

&lt;p&gt;As classes são estruturas de dados fundamentais que representam um tipo de objeto, definindo seu comportamento e quais informações ela pode armazenar.&lt;br&gt;
Classes tem atributos, propriedades, construtor e métodos. Nela está definido toda a estrutura básica de como será composta, ou seja, ela tipifica o que será modelado e determina os estados e comportamentos que os objetos podem ter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9h5b2ut2fh8ytjv28be.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9h5b2ut2fh8ytjv28be.png" alt="Image description" width="355" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• Atributos – Variáveis que armazenam dados.&lt;/p&gt;

&lt;p&gt;• Propriedades – Métodos que fornecem uma interface (Getters e Setters) para acessar e modificar um atributo.&lt;/p&gt;

&lt;p&gt;• Construtor – Método especial chamado quando uma nova instancia de classe é criada.&lt;/p&gt;

&lt;p&gt;• Métodos – Funções que definem o comportamento dos objetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de acesso das classes
&lt;/h2&gt;

&lt;p&gt;Classes podem ter diferentes níveis de acesso como por exemplo o public, um dos mais utilizado. Os níveis de acesso determinam a visibilidade de uma classe no escopo do projeto (Solution), classes publicas podem ser vistas por outras classes e objetos dentro do mesmo projeto (Solution), tornando os atributos e métodos acessíveis em outras classes e objetos.&lt;br&gt;
Os principais níveis de acesso em C# são:&lt;/p&gt;

&lt;p&gt;•Público (public): Uma classe pública é acessível de qualquer lugar dentro do projeto e seus atributos e métodos também serão do tipo público. &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8i5a7axo2fed8q0a8mh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8i5a7axo2fed8q0a8mh9.png" alt="Image description" width="272" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;•Privada (private): Uma classe privada só pode ser acessada dentro da mesma classe, ou seja, a classe e seus atributos e métodos só são visíveis dentro da própria classe. Classe do tipo privada não pode ser instanciada ou acessada.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulx42ycqhhjvwedlw10z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulx42ycqhhjvwedlw10z.png" alt="Image description" width="278" height="45"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;•Protegida (Protected): Uma classe protegida é acessível dentro da mesma, e de suas classes derivadas, permitindo que a classe derivada acesse seus métodos.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ilcc33ufx8zocbhisdp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ilcc33ufx8zocbhisdp.png" alt="Image description" width="296" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;•Interna (Internal): Uma classe interna só é acessível dentro do mesmo conjunto, não sendo possível acessar seus atributos e métodos em outra parte do projeto.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fffofltnepqwrrhgl4dcv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fffofltnepqwrrhgl4dcv.png" alt="Image description" width="289" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos de classes
&lt;/h2&gt;

&lt;p&gt;Em orientação a objetos temos cinco conceitos fundamentais em que uma classe pode ter, são ele, Heranças, Polimorfismo, Encapsulamento, Abstração e Interfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Herança
&lt;/h2&gt;

&lt;p&gt;É um mecanismo em que uma Subclasse herda atributos de uma Superclasse, com isso a Subclasse pode reutilizar o código da Superclasse, estendendo seu comportamento. Para herdamos um classe em C# usamos “ : ” (dois pontos) seguido pelo nome da classe. Por exemplo:&lt;/p&gt;

&lt;p&gt;A Superclasse Pessoa, tem seus atributos nome e idade e seus métodos, get e set, para cada atributo.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0lg8l35cegt1pn7hspa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0lg8l35cegt1pn7hspa.png" alt="Image description" width="303" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A subclasse Motorista herda a superclasse Pessoa. &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt2uj0su1ezp51czpgtv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt2uj0su1ezp51czpgtv.png" alt="Image description" width="296" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note que quando instanciamos a classe Motorista, (var motorista = new Motorsita;) podemos acessar os atributos e métodos da classe Pessoa, sem precisarmos fazer a instanciação da superclasse pessoa.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzs46caei39h2oj4pkrkl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzs46caei39h2oj4pkrkl.png" alt="Image description" width="532" height="344"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na execução do código podemos ver o retorno dos atributos Nome, Idade e Carro.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tvs70bl6t2p645pnydw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tvs70bl6t2p645pnydw.png" alt="Image description" width="308" height="208"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Polimorfismo
&lt;/h2&gt;

&lt;p&gt;O polimorfismo permite que objetos de diferentes tipos possam ser tratados de uma mesma forma, isso é, que uma classe base pode definir métodos que são implementados de maneiras diferentes por suas classes derivadas, permitindo que um método se comporte de maneira diferente.&lt;br&gt;
Podemos ter dois tipos de polimorfismo, são eles: &lt;/p&gt;

&lt;h2&gt;
  
  
  Polimorfismo de sobrecarga (Overloading)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Esse tipo acontece quando, vários métodos com o mesmo nome existem em uma classe, mas com diferentes parâmetros.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxwy9v1q03d33walwjw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxwy9v1q03d33walwjw6.png" alt="Image description" width="375" height="373"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Polimorfismo de subistituição (Overriding)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Em polimorfismo de subistituição, temos o conceito de herança que permite uma subclasse forneça uma implementação específica de um método que já esta definido na superclasse. Para isso usamos os modificadores Virtual e Override &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvid6m5hoosawzkx4fdq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvid6m5hoosawzkx4fdq.png" alt="Image description" width="501" height="507"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Encapsulamento
&lt;/h2&gt;

&lt;p&gt;É o conceito de proteger os atributos de uma classe, garantindo assim que os dados sejam manipulados de forma mais segura. Para utilizarmos o conceito de encapsulamento temos que utilizar os modificadores de acesso, anteriormente falado nesse artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modificadores de Acesso
&lt;/h2&gt;

&lt;p&gt;Os modificadores controlam a visibilidade e a acessibilidade dos atributos da classe, os modificadores são:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;•Public – O atributo e visível em toda parte do código.&lt;br&gt;
•Private – O atributo e visível somente dentro da própria classe.&lt;br&gt;
•Protected – O atributo e visível dentro da própria classe e de suas classes derivadas.&lt;br&gt;
•Internal – O atributo e visível somente dentro do mesmo assembly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As classes que utilizam o conceito de encapsulamento tem propriedades para controle de acesso e para controle de modificações, são métodos especiais chamados de Getters e Setters.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;•Getters – métodos publico (public) para controle de acesso do atributo.&lt;br&gt;
•Setters – método publico (public) para controle de modificações do atributo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphh0sqfcrozya8bck5cs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fphh0sqfcrozya8bck5cs.png" alt="Image description" width="509" height="196"&gt;&lt;/a&gt;&lt;br&gt;
Por definição quando delcaramos os atributos, colocamos o _ (Underline) na frente do nome. E a primeira letra sempre em letra minúscula, pois quando geramos o Getters e Setters a própria linguagem já modifica a primeira letra para maiúscula.&lt;/p&gt;

&lt;h2&gt;
  
  
  Abstração
&lt;/h2&gt;

&lt;p&gt;A abstração é o processo de esconder os detalhes de um objeto, ou seja ela serve como base para uma outra classe. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;•Uma classe abstrata não pode ser instanciada.&lt;br&gt;
•Serve apenas como modelo para outra classe.&lt;br&gt;
•Pode conter métodos abstratos sem implementação, e métodos concretos com implementações.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff17u97fev1p2ymmrqzz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff17u97fev1p2ymmrqzz9.png" alt="Image description" width="489" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Interfaces
&lt;/h2&gt;

&lt;p&gt;Uma interface declara um conjunto de métodos, mais não fornece corpo para esses métodos, com isso a classe que a implemente é quem dá copo ao método. Uma interface pode ser chamada de contrato.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;•Conceitos básicos de Interfaces:&lt;br&gt;
•Para definir uma interface usamos a palavra ‘Interface’.&lt;br&gt;
•Pode conter declarações de métodos.&lt;br&gt;
•Não contem corpo somente assinatura.&lt;br&gt;
•Qualquer classe que implemente uma interface, obrigatoriamente deve fornecer corpo para os métodos da interface herdada. &lt;br&gt;
•Uma classe pode implementar varias interfaces.&lt;br&gt;
•Interfaces permitem o polimorfismo, permitindo que diferentes classes tratem seus métodos de formas diferentes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Criando a Interface:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd40kgxu64i0a3tnj2o0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd40kgxu64i0a3tnj2o0w.png" alt="Image description" width="256" height="196"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementando a Interface&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsmres0flgenikat0dr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsmres0flgenikat0dr3.png" alt="Image description" width="322" height="271"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E quais as diferenças entre as interfaces e as classes abstratas?&lt;/p&gt;

&lt;p&gt;Podemos dizer que as interfaces não possuem implementações, apenas declarações o que não ocorre nas classes abstratas, que podem ter implementações parciais ou totais. Outro ponto é, uma classe só pode herdar uma única classe abstrata, mas pode herdar múltiplas interfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetos
&lt;/h2&gt;

&lt;p&gt;Objetos são instancias de classes, permitindo a criação de componentes modulares e reutilizáveis. Cada objeto possui seu próprio conjunto de dados, que são armazenados nos atributos e propriedades definidos pela classe.&lt;/p&gt;

&lt;p&gt;Como exemplo vamos usar uma Entidade Pessoa com a visibilidade publica mas utilizando o conceito de encapsulamento dos atributos que são, Nome e Idade.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57h3p8q5ikwvrf8iwf9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57h3p8q5ikwvrf8iwf9n.png" alt="Image description" width="519" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos fazer a instancia da entidade Pessoa de duas formas, são elas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Primeira forma de instanciar a entidade pessoa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43hkuqu5vlfakl3chwfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43hkuqu5vlfakl3chwfl.png" alt="Image description" width="374" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No código acima usamos a palavra reservada “var” para criar uma variável, em seguida colocamos o nome da variável, que no caso é ‘pessoa’, e atribuímos o sinal de = (igual) para informar que, vamos receber os dados da entidade Pessoa(). Para instanciar uma nova classe Pessoa() usamos a palavra reservada “new” logo em seguida o nome da classe ou entidade, nesse caso a entidade Pessoa(). Repare que depois de informarmos a classe/Entidade utilizamos o () (Parênteses), isso significa que podemos colocar parâmetros, mas temos que nos atentar para qual tipo a classe pode receber, que no casso acima é Nome do tipo string e Idade do tipo int.&lt;br&gt;
Quando fazemos a instanciação de uma classe podemos ver os seus atributos através dos seus métodos públicos, Get (Getters) e Set (Setters), podendo assim atribuir valores aos mesmos. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbmu5rx66osg0bqdpvpr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbmu5rx66osg0bqdpvpr.png" alt="Image description" width="326" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Segunda forma de instanciar a entidade pessoa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tlobgzwsu1mnyf68110.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tlobgzwsu1mnyf68110.png" alt="Image description" width="335" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A segunda forma de instanciar a entidade Pessoa é bem parecida com a primeira, a diferença é, que ao invés de usarmos a palavra reservada “var”, criamos o objeto Pessoa e damos o nome de pessoa que vai receber uma nova instancia de Pessoa().&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;As classes em C# .NET são fundamentais para a criação de aplicações. Compreender a estrutura, os componentes e os conceitos como herança, polimorfismo e encapsulamento é essencial para qualquer desenvolvedor C#. Através de exemplos, este artigo demonstrou como implementar e utilizar classes, promovendo a reutilização de código e a manutenção de software.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
