<?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: Lincoln Quinan Junior</title>
    <description>The latest articles on DEV Community by Lincoln Quinan Junior (@lincolnqjunior).</description>
    <link>https://dev.to/lincolnqjunior</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%2F1309029%2F691874a3-4ef8-45a9-81fd-1f1032bb868f.jpeg</url>
      <title>DEV Community: Lincoln Quinan Junior</title>
      <link>https://dev.to/lincolnqjunior</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lincolnqjunior"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Wed, 14 May 2025 12:54:42 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/-16o4</link>
      <guid>https://dev.to/lincolnqjunior/-16o4</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/copilotkit/introducing-ag-ui-the-protocol-where-agents-meet-users-10gp" class="crayons-story__hidden-navigation-link"&gt;Introducing AG-UI: The Protocol Where Agents Meet Users&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/copilotkit"&gt;
            &lt;img alt="CopilotKit logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F7820%2F85b7e418-7abd-4fb5-8be6-69eb48a30e53.gif" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/nathan_tarbert" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1031984%2Fe6629bb7-d446-4f40-b537-d2fa664bf5fd.jpg" alt="nathan_tarbert profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/nathan_tarbert" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nathan Tarbert
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nathan Tarbert
                
              
              &lt;div id="story-author-preview-content-2484677" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/nathan_tarbert" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1031984%2Fe6629bb7-d446-4f40-b537-d2fa664bf5fd.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nathan Tarbert&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/copilotkit" class="crayons-story__secondary fw-medium"&gt;CopilotKit&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/copilotkit/introducing-ag-ui-the-protocol-where-agents-meet-users-10gp" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 13 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/copilotkit/introducing-ag-ui-the-protocol-where-agents-meet-users-10gp" id="article-link-2484677"&gt;
          Introducing AG-UI: The Protocol Where Agents Meet Users
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/copilotkit/introducing-ag-ui-the-protocol-where-agents-meet-users-10gp" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;234&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/copilotkit/introducing-ag-ui-the-protocol-where-agents-meet-users-10gp#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              18&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Aprimorando a Análise Estática com a Onda de Aviso 7 no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Fri, 22 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/aprimorando-a-analise-estatica-com-a-onda-de-aviso-7-no-c-11-4efg</link>
      <guid>https://dev.to/lincolnqjunior/aprimorando-a-analise-estatica-com-a-onda-de-aviso-7-no-c-11-4efg</guid>
      <description>&lt;p&gt;Ao concluirmos nossa série exploratória sobre as inovações do C# 11, dedicamos este último capítulo a um recurso que, embora não adicione novas capacidades sintáticas ou funcionais à linguagem, desempenha um papel crucial em elevar a qualidade e a segurança do código: a Onda de Aviso 7. Esta nova onda de avisos do compilador é uma ferramenta essencial para identificar antecipadamente problemas que poderiam levar a comportamentos indesejados ou erros em tempo de execução.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Importância da Onda de Aviso 7
&lt;/h2&gt;

&lt;p&gt;A Onda de Aviso 7 aprofunda o compromisso do C# com a segurança do tipo e a correção do código ao expandir o conjunto de avisos de compilação, focando em áreas críticas como a manipulação de nulos e padrões de codificação seguros. Esses avisos são projetados para alertar os desenvolvedores sobre práticas que, embora não incorretas sintaticamente, podem levar a bugs sutis e difíceis de diagnosticar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Acesso a Objeto Nulo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#nullable enable
&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Demonstracao&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExibirTexto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Aviso: referência nula potencial.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este aviso ajuda a evitar um dos problemas mais comuns e perigosos em C#: a tentativa de acessar membros de um objeto nulo, fornecendo uma verificação de segurança em tempo de compilação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Refinamento de Padrões
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AvaliarObjeto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Aviso: sugestão de melhoria de padrão.&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, a Onda de Aviso 7 pode orientar sobre o uso mais eficiente e seguro de padrões, incentivando a adoção de práticas de codificação que melhoram a clareza e a robustez do código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens da Onda de Aviso 7
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Antecipação de Problemas&lt;/strong&gt;: Identifica potenciais falhas de código antes da execução, reduzindo a incidência de bugs em produção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promoção de Código Limpo&lt;/strong&gt;: Incentiva a adoção de melhores práticas e padrões de codificação, contribuindo para a manutenção e legibilidade do código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evolução Contínua&lt;/strong&gt;: Reflete o esforço contínuo do C# em fornecer ferramentas que auxiliam os desenvolvedores na escrita de código de alta qualidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão da Série
&lt;/h2&gt;

&lt;p&gt;Com a Onda de Aviso 7, o C# 11 reafirma seu compromisso com a evolução contínua, oferecendo aos desenvolvedores meios para escrever código mais seguro, eficiente e de fácil manutenção. Ao longo desta série, exploramos diversas funcionalidades que ilustram o esforço do C# em se adaptar às necessidades modernas de desenvolvimento, mantendo-se como uma linguagem poderosa, expressiva e versátil.&lt;/p&gt;

&lt;p&gt;Esperamos que esta série tenha fornecido insights valiosos e inspirado você a explorar as novidades do C# 11 em seus projetos, aproveitando as melhorias para aprimorar suas práticas de desenvolvimento e a qualidade do seu código. O C# continua a ser uma linguagem em constante evolução, e cada nova versão traz ferramentas e recursos que nos desafiam a sermos melhores desenvolvedores.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Refinando a Conversão de Grupo de Métodos para Delegado no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Thu, 21 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/refinando-a-conversao-de-grupo-de-metodos-para-delegado-no-c-11-4fgp</link>
      <guid>https://dev.to/lincolnqjunior/refinando-a-conversao-de-grupo-de-metodos-para-delegado-no-c-11-4fgp</guid>
      <description>&lt;p&gt;Prosseguindo com nossa exploração detalhada das inovações trazidas pelo C# 11, chegamos a uma melhoria que simplifica significativamente o trabalho com delegados: a conversão aprimorada de grupo de métodos para delegado. Essa melhoria é especialmente valiosa em cenários com múltiplas sobrecargas de métodos, onde a seleção explícita da sobrecarga correta pode ser propensa a erros e tornar o código mais verboso do que necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprimorando a Conversão para Delegados
&lt;/h2&gt;

&lt;p&gt;No C#, delegados são objetos que referenciam métodos, permitindo que métodos sejam passados como parâmetros, armazenados em variáveis ou mesmo retornados por outros métodos. A conversão de um grupo de métodos para um delegado permite que o compilador selecione automaticamente a sobrecarga de método apropriada com base no tipo do delegado. Com o C# 11, essa conversão foi aprimorada para tornar o código mais conciso e intuitivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Seleção Automática de Sobrecarga
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;greetAction&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;greetAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, Mundo!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o compilador automaticamente seleciona a sobrecarga do método &lt;code&gt;Console.WriteLine&lt;/code&gt; que aceita um &lt;code&gt;string&lt;/code&gt;, com base no tipo do delegado &lt;code&gt;Action&amp;lt;string&amp;gt;&lt;/code&gt;. Isso elimina a necessidade de especificar explicitamente a sobrecarga, tornando o código mais limpo e direto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Trabalhando com Sobrecargas Múltiplas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Processando número: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Processando texto: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;processNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;processText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;processNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;processText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C# 11"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, a conversão aprimorada de grupo de métodos para delegado facilita o trabalho com múltiplas sobrecargas do método &lt;code&gt;Process&lt;/code&gt;. O compilador infere corretamente qual sobrecarga associar a cada delegado, baseando-se no tipo do delegado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Evitando Ambiguidades com Expressividade
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Double: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Float: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;displayDouble&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Display&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;displayFloat&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Display&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;displayDouble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;9.8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;displayFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3.14f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste cenário, as melhorias permitem associar explicitamente as sobrecargas corretas aos delegados correspondentes sem ambiguidade, mesmo quando os tipos dos parâmetros são semelhantes, como &lt;code&gt;float&lt;/code&gt; e &lt;code&gt;double&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Delegados como Parâmetros de Métodos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ExecuteAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Executado com sucesso!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;ExecuteAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A capacidade de passar diretamente um grupo de métodos como um delegado para outro método é simplificada, permitindo que padrões como callbacks e eventos sejam implementados de forma mais limpa e intuitiva.&lt;/p&gt;

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

&lt;p&gt;A conversão aprimorada de grupo de métodos para delegado no C# 11 representa um avanço significativo na maneira como interagimos com delegados, tornando o código mais conciso, expressivo e menos propenso a erros. Essa melhoria é particularmente útil em bibliotecas e frameworks onde a clareza e a precisão na seleção de métodos são cruciais.&lt;/p&gt;

&lt;p&gt;À medida que continuamos nossa série, fica cada vez mais evidente como o C# 11 está equipando os desenvolvedores com ferramentas poderosas para escrever código eficiente e seguro. Mantenha-se atento para mais artigos, onde exploraremos mais funcionalidades que o C# 11 oferece para aprimorar seus projetos de desenvolvimento.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Dominando Campos `ref` e `ref` Escopados no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Wed, 20 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/dominando-campos-ref-e-ref-escopados-no-c-11-3la7</link>
      <guid>https://dev.to/lincolnqjunior/dominando-campos-ref-e-ref-escopados-no-c-11-3la7</guid>
      <description>&lt;p&gt;Na décima terceira parte de nossa série sobre as inovações do C# 11, vamos mergulhar em um recurso projetado para melhorar tanto a performance quanto a segurança do código: os campos &lt;code&gt;ref&lt;/code&gt; e &lt;code&gt;ref&lt;/code&gt; escopados. Essa adição é especialmente relevante para desenvolvedores que trabalham com tipos de valor e operações de baixo nível, pois permite manipular referências de forma mais eficiente e segura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução aos Campos &lt;code&gt;ref&lt;/code&gt; e &lt;code&gt;ref&lt;/code&gt; Escopados
&lt;/h2&gt;

&lt;p&gt;Os campos &lt;code&gt;ref&lt;/code&gt; permitem que structs tenham campos que são referências a outros dados, não apenas valores. Isso é particularmente útil em cenários de alta performance, onde a cópia de dados pode ser um gargalo. Já os &lt;code&gt;ref&lt;/code&gt; escopados restringem a vida útil dessas referências, aumentando a segurança ao evitar que referências escapem de um escopo onde não são mais válidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Usando Campos &lt;code&gt;ref&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;RefStruct&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;RefField&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;RefStruct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;RefField&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;refStruct&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RefStruct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;refStruct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RefField&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Saída: 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo ilustra como um campo &lt;code&gt;ref&lt;/code&gt; em uma &lt;code&gt;ref struct&lt;/code&gt; pode ser usado para referenciar um dado externo. Ao modificar &lt;code&gt;RefField&lt;/code&gt;, o valor original de &lt;code&gt;a&lt;/code&gt; é alterado, demonstrando o poder e a flexibilidade dos campos &lt;code&gt;ref&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Limitações de &lt;code&gt;ref&lt;/code&gt; Escopados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MetodoExemplo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;refStruct&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RefStruct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// A referência 'local' é segura aqui, dentro do escopo onde foi definida.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;local&lt;/code&gt; é uma variável local que é passada por referência para &lt;code&gt;refStruct&lt;/code&gt;. Com &lt;code&gt;ref&lt;/code&gt; escopados, o compilador garante que &lt;code&gt;refStruct&lt;/code&gt; não possa viver além do escopo de &lt;code&gt;MetodoExemplo&lt;/code&gt;, prevenindo o risco de referenciar uma variável que não existe mais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Trabalhando com Arrays
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ManipularArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;primeiroElemento&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="c1"&gt;// Operações com 'primeiroElemento' afetarão diretamente 'array[0]'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse exemplo mostra como campos &lt;code&gt;ref&lt;/code&gt; podem ser utilizados para referenciar elementos dentro de um array, permitindo manipulações diretas e eficientes sem a necessidade de cópias ou passagens por valor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: &lt;code&gt;ref&lt;/code&gt; Escopados em Estruturas de Controle
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condicao&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;refLocal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;condicao&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// 'refLocal' pode ser usado aqui de forma segura.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// 'refLocal' não é mais acessível aqui, garantindo a segurança.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, &lt;code&gt;refLocal&lt;/code&gt; é uma referência escopada dentro de uma estrutura de controle &lt;code&gt;if&lt;/code&gt;. Isso garante que a referência só seja acessível onde é válida, e não fora do bloco &lt;code&gt;if&lt;/code&gt;, evitando erros comuns relacionados ao escopo de vida das referências.&lt;/p&gt;

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

&lt;p&gt;Os campos &lt;code&gt;ref&lt;/code&gt; e &lt;code&gt;ref&lt;/code&gt; escopados introduzidos no C# 11 representam uma evolução significativa na forma como podemos manipular e referenciar dados em C#. Esses recursos oferecem uma combinação poderosa de eficiência e segurança, permitindo operações de baixo nível sem comprometer a integridade do programa.&lt;/p&gt;

&lt;p&gt;Como vimos ao longo desta série, o C# 11 está repleto de melhorias e novidades que visam não apenas ampliar as capacidades da linguagem, mas também tornar o desenvolvimento mais seguro, eficiente e agradável. Continue acompanhando para mais insights sobre como essas novas funcionalidades podem ser aplicadas em seus projetos de desenvolvimento.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Enriquecendo Operações Numéricas com `IntPtr` Numérico no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Tue, 19 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/enriquecendo-operacoes-numericas-com-intptr-numerico-no-c-11-4odp</link>
      <guid>https://dev.to/lincolnqjunior/enriquecendo-operacoes-numericas-com-intptr-numerico-no-c-11-4odp</guid>
      <description>&lt;p&gt;Dando continuidade à nossa série detalhada sobre as novidades do C# 11, hoje vamos falar sobre uma atualização particularmente interessante para aqueles que trabalham com operações de baixo nível ou interoperação com código nativo: a introdução de &lt;code&gt;IntPtr&lt;/code&gt; e &lt;code&gt;UIntPtr&lt;/code&gt; como tipos numéricos. Com essa mudança, &lt;code&gt;IntPtr&lt;/code&gt; e &lt;code&gt;UIntPtr&lt;/code&gt; agora implementam interfaces numéricas, ampliando significativamente suas aplicações, especialmente em contextos genéricos matemáticos.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;IntPtr&lt;/code&gt; e &lt;code&gt;UIntPtr&lt;/code&gt; no Universo Numérico
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;IntPtr&lt;/code&gt; e &lt;code&gt;UIntPtr&lt;/code&gt; são tipos que representam ponteiros ou inteiros do tamanho da palavra do processador. Tradicionalmente utilizados para interoperação com código nativo ou para armazenar endereços de memória de forma segura em código gerenciado, sua funcionalidade era um tanto limitada em comparações e operações matemáticas. Com o C# 11, isso muda, pois eles passam a integrar o ecossistema de tipos numéricos, possibilitando uma série de operações matemáticas diretamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Adição de Ponteiros
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="nf"&gt;AddPointers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;ptr1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IntPtr&lt;/span&gt; &lt;span class="n"&gt;ptr2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ptr1&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ptr2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, a adição de dois valores &lt;code&gt;IntPtr&lt;/code&gt; é realizada diretamente, uma operação que se beneficia da nova capacidade numérica desses tipos, simplificando a aritmética de ponteiros em contextos seguros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Uso em Códigos Genéricos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;Increment&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;INumber&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;One&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pointer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;Increment&lt;/code&gt; é um método genérico que pode agora ser aplicado a &lt;code&gt;IntPtr&lt;/code&gt;, graças à implementação das interfaces numéricas. Isso abre novas portas para a reutilização de código e a aplicação de algoritmos genéricos a tipos anteriormente restritos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Comparando Ponteiros
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;AreEqual&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IEqualityOperators&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ptr1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ptr2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;isEqual&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;AreEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ptr1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ptr2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo demonstra a comparação direta entre dois &lt;code&gt;IntPtr&lt;/code&gt;, utilizando interfaces genéricas para igualdade. Isso evidencia como operações de comparação se tornam mais naturais e integradas com &lt;code&gt;IntPtr&lt;/code&gt; e &lt;code&gt;UIntPtr&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Operações Matemáticas Avançadas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;CalculateOffset&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;baseAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IAdditionOperators&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;baseAddress&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;baseAddress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IntPtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;newAddress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;CalculateOffset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso, calculamos um novo endereço de memória adicionando um offset a um endereço base, usando &lt;code&gt;IntPtr&lt;/code&gt; em um contexto genérico que requer operações de adição. Este exemplo ilustra a flexibilidade e o poder dos novos &lt;code&gt;IntPtr&lt;/code&gt; e &lt;code&gt;UIntPtr&lt;/code&gt; numéricos em operações mais complexas.&lt;/p&gt;

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

&lt;p&gt;A transformação de &lt;code&gt;IntPtr&lt;/code&gt; e &lt;code&gt;UIntPtr&lt;/code&gt; em tipos numéricos no C# 11 é um avanço notável para a linguagem, especialmente para desenvolvedores que trabalham com código de interoperação ou que necessitam de operações matemáticas precisas com ponteiros. Essa mudança não apenas simplifica o código existente, como também abre novas possibilidades para a criação de algoritmos genéricos que são verdadeiramente agnósticos em relação ao tipo de dados numéricos.&lt;/p&gt;

&lt;p&gt;À medida que avançamos em nossa série, fica claro o compromisso do C# com a inovação e a melhoria contínua, buscando sempre oferecer aos desenvolvedores as ferramentas necessárias para enfrentar os desafios modernos da programação. Fique conosco para mais insights e análises sobre as capacidades que o C# 11 traz para enriquecer ainda mais o seu arsenal de desenvolvimento.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Explorando o Escopo Estendido do `nameof` no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Sat, 16 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/explorando-o-escopo-estendido-do-nameof-no-c-11-25o6</link>
      <guid>https://dev.to/lincolnqjunior/explorando-o-escopo-estendido-do-nameof-no-c-11-25o6</guid>
      <description>&lt;p&gt;Avançamos na nossa jornada pelas novidades do C# 11 destacando um recurso que, apesar de sutil, tem o potencial de impactar significativamente a clareza e a manutenibilidade do código: o escopo estendido do operador &lt;code&gt;nameof&lt;/code&gt;. Este aprimoramento aumenta a flexibilidade do &lt;code&gt;nameof&lt;/code&gt;, permitindo que desenvolvedores o utilizem em contextos mais amplos, incluindo fora de escopos de membros, o que facilita a refatoração e melhora a legibilidade do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ampliando os Horizontes do &lt;code&gt;nameof&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O operador &lt;code&gt;nameof&lt;/code&gt; é uma ferramenta poderosa em C# para obter o nome de variáveis, propriedades, métodos e outros membros como uma string literal em tempo de compilação. Isso é especialmente útil para evitar referências de strings "hard-coded", que são propensas a erros de digitação e complicam o processo de refatoração. Com o C# 11, o &lt;code&gt;nameof&lt;/code&gt; torna-se ainda mais poderoso e versátil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Refatoração Segura
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;NomeProp&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Uso estendido do nameof&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o &lt;code&gt;nameof(Nome)&lt;/code&gt; é utilizado para definir uma constante que armazena o nome da propriedade &lt;code&gt;Nome&lt;/code&gt;. Isso garante que referências ao nome da propriedade em strings estejam sempre corretas, mesmo que a propriedade seja renomeada durante uma refatoração.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Uso em Atributos Personalizados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;AttributeUsage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AttributeTargets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Property&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ValidatePropertyAttribute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Attribute&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;PropertyName&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ValidatePropertyAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;PropertyName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;ValidateProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;nameof&lt;/code&gt; é utilizado para passar o nome da propriedade &lt;code&gt;Nome&lt;/code&gt; como um argumento para o atributo &lt;code&gt;ValidateProperty&lt;/code&gt;, garantindo que o nome da propriedade esteja correto e facilitando a manutenção do código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Melhorias na Documentação do Código
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// Processa a propriedade &amp;lt;see cref="nameof(Nome)"/&amp;gt;.&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ProcessarNome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Lógica de processamento&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O uso do &lt;code&gt;nameof&lt;/code&gt; em comentários XML para documentação melhora a precisão e a utilidade da documentação gerada, assegurando que referências a membros estejam sempre atualizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Verificações de Argumentos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ConfigurarValor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nomePropriedade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nomePropriedade&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Configura o valor&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome de propriedade inválido."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nomePropriedade&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo demonstra o uso de &lt;code&gt;nameof&lt;/code&gt; para fornecer mensagens de erro claras e precisas em verificações de argumentos, facilitando o diagnóstico de problemas.&lt;/p&gt;

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

&lt;p&gt;O escopo estendido do &lt;code&gt;nameof&lt;/code&gt; no C# 11 é um exemplo de como melhorias aparentemente pequenas podem oferecer grandes benefícios em termos de clareza, segurança e facilidade de manutenção do código. Esse recurso reforça as melhores práticas de programação ao reduzir a fragilidade do código associada a literais de strings, tornando o processo de refatoração mais seguro e direto.&lt;/p&gt;

&lt;p&gt;Ao continuar explorando as funcionalidades do C# 11, fica evidente o compromisso com a evolução constante da linguagem, buscando sempre oferecer aos desenvolvedores as ferramentas necessárias para escrever código de alta qualidade, seguro e fácil de manter.&lt;/p&gt;

&lt;p&gt;Prepare-se para mais descobertas conforme prosseguimos com nossa série sobre as novidades do C# 11, onde cada artigo desvenda recursos que podem transformar sua maneira de codificar.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Avançando na Correspondência de Padrões com `Span&lt;char&gt;` no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/avancando-na-correspondencia-de-padroes-com-span-no-c-11-icn</link>
      <guid>https://dev.to/lincolnqjunior/avancando-na-correspondencia-de-padroes-com-span-no-c-11-icn</guid>
      <description>&lt;p&gt;Continuando nossa exploração pelas inovações do C# 11, chegamos a uma funcionalidade que promete enriquecer significativamente a maneira como manipulamos e comparamos strings: a capacidade de realizar correspondência de padrões usando &lt;code&gt;Span&amp;lt;char&amp;gt;&lt;/code&gt; com strings constantes. Esse aprimoramento é particularmente relevante para cenários de alta performance e manipulação de strings em nível mais baixo, onde a eficiência é crítica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expandindo a Correspondência de Padrões
&lt;/h2&gt;

&lt;p&gt;O C# tem evoluído constantemente suas capacidades de correspondência de padrões, tornando o código não apenas mais expressivo, mas também mais conciso. Com o C# 11, essa evolução continua ao permitir comparações diretas entre &lt;code&gt;Span&amp;lt;char&amp;gt;&lt;/code&gt; e strings constantes, uma adição que simplifica a manipulação de strings, especialmente em contextos onde a alocação de memória precisa ser minimizada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Verificação Simples de Igualdade
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsSpan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SequenceEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"As strings são iguais."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, &lt;code&gt;span.SequenceEqual("test")&lt;/code&gt; permite uma comparação direta e eficiente entre um &lt;code&gt;Span&amp;lt;char&amp;gt;&lt;/code&gt; e uma string literal, facilitando a verificação de igualdade sem a necessidade de conversões ou alocações adicionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Uso em Métodos de Extensão
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;ComecaCom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;prefixo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefixo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;span&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"exemplo"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsSpan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;span&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ComecaCom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ex"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O span começa com 'ex'."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo demonstra como a correspondência de padrões com &lt;code&gt;Span&amp;lt;char&amp;gt;&lt;/code&gt; pode ser integrada em métodos de extensão, proporcionando uma maneira elegante e eficiente de estender a funcionalidade de comparação de strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Busca de Padrões em Texto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Procurando por padrões no C# 11"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsSpan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;padrao&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"padrões"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsSpan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padrao&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Padrão encontrado!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, a busca por um padrão dentro de um texto é realizada de maneira eficiente, usando a representação de &lt;code&gt;Span&amp;lt;char&amp;gt;&lt;/code&gt; tanto para o texto quanto para o padrão de busca, ilustrando a utilidade do recurso em algoritmos de busca e manipulação de texto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Comparação Sensível a Caso
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;entrada&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Caso Sensível"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsSpan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entrada&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CASO SENSÍVEL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StringComparison&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrdinalIgnoreCase&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Igualdade sensível a caso."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo mostra como realizar comparações de strings que são sensíveis a maiúsculas e minúsculas, aproveitando as sobrecargas de métodos existentes que aceitam &lt;code&gt;Span&amp;lt;char&amp;gt;&lt;/code&gt;, garantindo que a lógica de comparação seja tanto precisa quanto eficiente.&lt;/p&gt;

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

&lt;p&gt;A introdução da correspondência de padrões com &lt;code&gt;Span&amp;lt;char&amp;gt;&lt;/code&gt; em uma string constante no C# 11 é um exemplo claro da contínua evolução da linguagem em direção à maior eficiência e expressividade. Este recurso abre novas portas para a manipulação de strings em cenários de alta performance, onde a redução de alocações de memória é crucial.&lt;/p&gt;

&lt;p&gt;À medida que exploramos mais profundamente as funcionalidades do C# 11, torna-se evidente o foco em fornecer aos desenvolvedores as ferramentas necessárias para escrever código mais limpo, seguro e eficiente. Fique atento para mais artigos desta série, onde revelaremos outras inovações empolgantes que o C# 11 traz para a mesa de desenvolvimento.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Simplificando Inicializações com Structs com Auto-Default no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Thu, 14 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/simplificando-inicializacoes-com-structs-com-auto-default-no-c-11-543m</link>
      <guid>https://dev.to/lincolnqjunior/simplificando-inicializacoes-com-structs-com-auto-default-no-c-11-543m</guid>
      <description>&lt;p&gt;Avançando na nossa série sobre as inovações do C# 11, hoje vamos abordar uma mudança sutil, mas muito bem-vinda para os desenvolvedores que trabalham com tipos de valor: a introdução de structs com auto-default. Esse recurso simplifica o trabalho com structs ao eliminar a necessidade de definir um construtor padrão para inicializar campos com valores padrão.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Benefício dos Structs com Auto-Default
&lt;/h2&gt;

&lt;p&gt;Structs são uma parte essencial da linguagem C#, oferecendo uma maneira eficiente de agrupar dados relacionados quando não é necessário o overhead de um objeto de classe. No entanto, a inicialização desses tipos poderia, até agora, exigir a definição explícita de um construtor padrão, especialmente quando se queria garantir que todos os campos fossem inicializados com valores específicos. Com a chegada do C# 11, essa necessidade desaparece, pois os structs são automaticamente capazes de inicializar seus campos com valores padrão.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Definição Simples de Struct
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Coordenadas&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;Latitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;Longitude&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Campos são automaticamente inicializados com 0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;Coordenadas&lt;/code&gt; é um struct que, sem a necessidade de um construtor padrão explícito, tem seus campos &lt;code&gt;Latitude&lt;/code&gt; e &lt;code&gt;Longitude&lt;/code&gt; automaticamente inicializados com &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Uso de Struct Auto-Default
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;localizacao&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Coordenadas&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Latitude: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;localizacao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Latitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Longitude: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;localizacao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Longitude&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, ao instanciar &lt;code&gt;Coordenadas&lt;/code&gt;, &lt;code&gt;Latitude&lt;/code&gt; e &lt;code&gt;Longitude&lt;/code&gt; são automaticamente definidos para &lt;code&gt;0&lt;/code&gt;, demonstrando como o struct com auto-default facilita a criação de instâncias sem inicializações adicionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Comparação com Classes
&lt;/h3&gt;

&lt;p&gt;Para compreender a vantagem, considere o caso de uma classe similar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Ponto&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Necessário inicializar explicitamente no construtor ou esperar a inicialização automática para propriedades auto-implementadas&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com classes, os campos ou propriedades não inicializados explicitamente em um construtor são definidos para seus valores padrão, mas o mesmo nível de clareza e simplicidade não estava disponível para structs até o C# 11.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Estruturas Mais Complexas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Informacoes&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// Nome é inicializado com null (ou a representação padrão de string em C# 8.0+ com tipos anuláveis referência habilitados) e Idade com 0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo mostra que, mesmo para tipos mais complexos que incluem strings ou outros tipos de referência, os structs com auto-default garantem que todos os campos sejam inicializados de forma adequada, reduzindo a chance de erros.&lt;/p&gt;

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

&lt;p&gt;A introdução de structs com auto-default no C# 11 é um exemplo claro de como melhorias aparentemente pequenas podem ter um impacto significativo na experiência de desenvolvimento. Este recurso não apenas simplifica a definição e uso de structs, mas também promove práticas de codificação mais seguras, garantindo que os campos sejam inicializados corretamente sem esforço adicional.&lt;/p&gt;

&lt;p&gt;Ao continuar explorando as novidades do C# 11, fica evidente o comprometimento contínuo com a evolução da linguagem, buscando sempre oferecer recursos que facilitam o trabalho dos desenvolvedores e melhoram a qualidade do código produzido.&lt;/p&gt;

&lt;p&gt;Fique atento para mais artigos desta série, onde mergulharemos em outras funcionalidades excitantes do C# 11 e como elas podem ser aplicadas para tornar seus projetos ainda melhores.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Aprimorando a Robustez do Código com Membros Obrigatórios no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/aprimorando-a-robustez-do-codigo-com-membros-obrigatorios-no-c-11-4olh</link>
      <guid>https://dev.to/lincolnqjunior/aprimorando-a-robustez-do-codigo-com-membros-obrigatorios-no-c-11-4olh</guid>
      <description>&lt;p&gt;Continuando nossa série sobre as novas funcionalidades do C# 11, vamos explorar um recurso projetado para melhorar a integridade e a robustez dos tipos em nossos programas: os membros obrigatórios. Com essa adição, o C# 11 torna possível definir propriedades e campos em classes e structs que devem ser obrigatoriamente fornecidos durante a criação de uma instância, garantindo assim que os objetos sejam sempre construídos em um estado válido.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que São Membros Obrigatórios?
&lt;/h2&gt;

&lt;p&gt;Membros obrigatórios são uma nova maneira de garantir que determinadas propriedades ou campos de uma classe ou struct sejam fornecidos antes que uma instância seja considerada válida. Esse recurso ajuda a evitar erros comuns em tempo de execução relacionados a valores nulos ou não inicializados, promovendo padrões de codificação mais seguros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Definindo uma Propriedade Obrigatória
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;Preco&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, &lt;code&gt;Produto&lt;/code&gt; tem uma propriedade &lt;code&gt;Nome&lt;/code&gt; marcada como &lt;code&gt;required&lt;/code&gt;, indicando que cada instância de &lt;code&gt;Produto&lt;/code&gt; deve ter um &lt;code&gt;Nome&lt;/code&gt; válido fornecido no momento da criação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Construção de Objetos com Membros Obrigatórios
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Produto&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Caderno"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Preco&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;7.99m&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao criar uma instância de &lt;code&gt;Produto&lt;/code&gt;, é necessário fornecer um valor para a propriedade &lt;code&gt;Nome&lt;/code&gt;, de acordo com a regra definida anteriormente. A tentativa de compilar o código sem fornecer &lt;code&gt;Nome&lt;/code&gt; resultará em um erro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Uso com Construtores
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Contato&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Contato&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mesmo quando um construtor é usado para inicializar a instância, as propriedades marcadas como &lt;code&gt;required&lt;/code&gt; devem ser atribuídas, garantindo a consistência do objeto desde sua criação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Structs com Membros Obrigatórios
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Configuracao&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Chave&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Valor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os membros obrigatórios também são aplicáveis a structs, garantindo que instâncias de structs sejam inicializadas com dados essenciais, fortalecendo a tipagem e a segurança de dados em toda a aplicação.&lt;/p&gt;

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

&lt;p&gt;Os membros obrigatórios introduzidos no C# 11 representam um passo significativo para a construção de softwares mais robustos e seguros, minimizando erros comuns relacionados à inicialização inadequada de objetos. Ao forçar que certas informações sejam fornecidas para a construção de instâncias, os desenvolvedores podem escrever códigos mais claros e expressivos, com garantias de integridade de dados desde o início.&lt;/p&gt;

&lt;p&gt;Essa funcionalidade se alinha com as tendências modernas de programação que enfatizam a segurança de tipos e a prevenção de erros, oferecendo mais uma ferramenta valiosa para o desenvolvimento de aplicações confiáveis e de alta qualidade em C#.&lt;/p&gt;

&lt;p&gt;Fique conosco na série para descobrir mais sobre como as novas funcionalidades do C# 11 podem enriquecer seus projetos e levar suas habilidades de codificação para o próximo nível.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Organizando Melhor o Código com Tipos Locais de Arquivo no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Tue, 12 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/organizando-melhor-o-codigo-com-tipos-locais-de-arquivo-no-c-11-4g6d</link>
      <guid>https://dev.to/lincolnqjunior/organizando-melhor-o-codigo-com-tipos-locais-de-arquivo-no-c-11-4g6d</guid>
      <description>&lt;p&gt;Na sétima parte de nossa série sobre as novidades do C# 11, exploramos um recurso que promete trazer uma nova camada de organização e encapsulamento ao nosso código: os tipos locais de arquivo. Esta funcionalidade permite a declaração de tipos (classes, structs, interfaces) que são visíveis e acessíveis apenas dentro do arquivo em que são declarados, ajudando a manter o escopo dos seus tipos bem controlado e seu código mais organizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendendo os Tipos Locais de Arquivo
&lt;/h2&gt;

&lt;p&gt;Tipos locais de arquivo no C# 11 são uma adição significativa para desenvolvedores que buscam manter uma estrutura de código limpa e bem organizada. Ao limitar a visibilidade de um tipo ao arquivo em que ele é declarado, podemos evitar conflitos e usos indevidos em outras partes do projeto, mantendo o encapsulamento e a clareza do design do software.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Declaração de Classe Local
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelperLocal&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Auxiliar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Executando uma tarefa auxiliar."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, &lt;code&gt;HelperLocal&lt;/code&gt; é uma classe que só pode ser usada dentro do arquivo em que está declarada. Isso é útil para funções auxiliares ou classes de utilidade que não são destinadas a serem expostas para todo o projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Uso de Struct Local
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Coordenadas&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Coordenadas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;Coordenadas&lt;/code&gt; é um struct local ao arquivo, ideal para representar dados internos de uma lógica específica sem poluir o espaço de nomes global ou arriscar uso indevido em outras partes da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Interface Local
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IOperacaoLocal&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Executar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Declaração de uma interface local que pode ser implementada por classes ou structs dentro do mesmo arquivo, oferecendo uma forma de garantir contratos de implementação restritos ao escopo do arquivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Utilizando Classes Locais
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Processador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Processar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;auxiliar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HelperLocal&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;auxiliar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Auxiliar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo mostra como uma classe local pode ser instanciada e utilizada dentro do mesmo arquivo, mantendo o encapsulamento e a organização do código.&lt;/p&gt;

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

&lt;p&gt;Os tipos locais de arquivo introduzidos no C# 11 são uma excelente adição à linguagem, oferecendo mais controle sobre a visibilidade e o escopo de tipos dentro de projetos. Este recurso é particularmente útil em cenários onde a definição de um tipo é relevante apenas para a lógica contida em um arquivo específico, ajudando a evitar a exposição desnecessária de detalhes de implementação e mantendo o código mais limpo e organizado.&lt;/p&gt;

&lt;p&gt;À medida que continuamos nossa exploração das novidades do C# 11, fica evidente o foco em aprimorar a expressividade e a eficiência da linguagem para desenvolvedores. Os tipos locais de arquivo são apenas um exemplo de como o C# está se adaptando às necessidades modernas de desenvolvimento de software, promovendo práticas de codificação mais eficazes e organizadas. Fique atento para mais insights sobre como aproveitar ao máximo as inovações do C# 11 em seus projetos.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Revolucionando a Verificação de Coleções com Padrões de Lista no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Sat, 09 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/revolucionando-a-verificacao-de-colecoes-com-padroes-de-lista-no-c-11-1goi</link>
      <guid>https://dev.to/lincolnqjunior/revolucionando-a-verificacao-de-colecoes-com-padroes-de-lista-no-c-11-1goi</guid>
      <description>&lt;p&gt;Avançamos em nossa série exploratória sobre as inovações do C# 11 com um recurso que transforma radicalmente a maneira como interagimos com coleções: os padrões de lista. Esse novo recurso introduz uma sintaxe concisa e poderosa para a verificação de padrões em coleções, como listas e arrays, permitindo condições complexas de maneira elegante e legível.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Que São Padrões de Lista?
&lt;/h2&gt;

&lt;p&gt;Padrões de lista no C# 11 são uma extensão do sistema de padrões existente que permite inspecionar e deconstruir coleções com base em seus elementos. Essa funcionalidade simplifica a verificação de condições específicas dentro de uma coleção, como a presença de um conjunto de elementos em determinadas posições ou a estrutura geral da coleção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Verificando o Primeiro e o Último Elemento
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;..,&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A lista começa com 0 e termina com 5."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo demonstra como verificar facilmente se a lista começa com 0 e termina com 5, usando os padrões de lista para capturar essa estrutura específica.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Capturando Elementos Específicos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"C#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Padrões"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Lista"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"C#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"11"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Lista"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Elementos intermediários: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, utilizamos padrões de lista para capturar todos os elementos intermediários entre "C#" e "Lista", demonstrando a flexibilidade dos padrões de lista em manipular e acessar partes específicas de uma coleção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: Desconstruindo uma Lista
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Primeiro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Último"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mix&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;..,&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Primeiro: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Último: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo mostra como os padrões de lista podem ser usados para desconstruir uma lista, capturando o primeiro e o último elemento, independentemente do tamanho da lista ou dos tipos de elemento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Correspondência Complexa
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;nestedList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s"&gt;"C#"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;11&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nestedList&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;..,&lt;/span&gt; &lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A lista contém uma sublista [1, 2, 3] e termina com 11."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo ilustra como padrões de lista podem ser usados para verificar estruturas mais complexas dentro de coleções, incluindo a presença de sublistas com elementos específicos.&lt;/p&gt;

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

&lt;p&gt;Padrões de lista no C# 11 oferecem uma sintaxe rica e expressiva para a verificação e deconstrução de coleções, ampliando as possibilidades de manipulação de dados de forma eficiente e legível. Esse recurso facilita a escrita de condições complexas e a captura de elementos específicos dentro de coleções, promovendo um código mais claro e conciso.&lt;/p&gt;

&lt;p&gt;À medida que exploramos mais profundamente as novidades do C# 11, fica evidente o compromisso contínuo em evoluir a linguagem de forma a atender às necessidades modernas de desenvolvimento. Os padrões de lista são apenas uma das muitas inovações que demonstram esse compromisso. Continue acompanhando nossa série para descobrir mais sobre as capacidades transformadoras do C# 11 e como elas podem enriquecer seus projetos de desenvolvimento.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Simplificando Strings Formatadas com Quebras de Linha no C# 11</title>
      <dc:creator>Lincoln Quinan Junior</dc:creator>
      <pubDate>Fri, 08 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://dev.to/lincolnqjunior/simplificando-strings-formatadas-com-quebras-de-linha-no-c-11-ig5</link>
      <guid>https://dev.to/lincolnqjunior/simplificando-strings-formatadas-com-quebras-de-linha-no-c-11-ig5</guid>
      <description>&lt;p&gt;Prosseguindo com nossa série sobre as novidades do C# 11, chegamos a uma funcionalidade que, por sua simplicidade e utilidade, é capaz de transformar a forma como lidamos com strings longas e formatadas: a inclusão direta de quebras de linha em expressões de interpolação de string. Esta melhoria tem o potencial de tornar o código mais legível e limpo, especialmente útil em cenários onde a clareza do código é fundamental.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Elegância das Quebras de Linha em Strings Formatadas
&lt;/h2&gt;

&lt;p&gt;No C# 11, expressões de interpolação de string podem incluir quebras de linha diretamente, eliminando a necessidade de concatenação manual ou o uso de caracteres especiais para novas linhas. Isso é particularmente benéfico ao trabalhar com strings que contêm múltiplas linhas de texto, como consultas SQL, JSON formatado ou mensagens de texto extensas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 1: Mensagem Multilinha
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"""Olá, João,
&lt;/span&gt;&lt;span class="n"&gt;Espero&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;esteja&lt;/span&gt; &lt;span class="n"&gt;bem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Atenciosamente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;Equipe&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;Suporte&lt;/span&gt;&lt;span class="s"&gt;""";
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este exemplo demonstra como criar uma mensagem de email ou de suporte multilinha de forma limpa e direta, sem a necessidade de operadores de concatenação ou caracteres de escape para novas linhas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 2: Consulta SQL Formatada
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"""
&lt;/span&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Produtos&lt;/span&gt;
&lt;span class="n"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;Categoria&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;Eletr&lt;/span&gt;&lt;span class="err"&gt;ô&lt;/span&gt;&lt;span class="n"&gt;nicos&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;ORDER&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;Pre&lt;/span&gt;&lt;span class="err"&gt;ç&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;DESC&lt;/span&gt;
&lt;span class="s"&gt;""";
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, uma consulta SQL é construída com clareza e facilidade de leitura, graças à capacidade de formatar a consulta com quebras de linha e identação, sem prejudicar a execução ou a clareza do código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 3: JSON Formatado
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"""{
&lt;/span&gt;  &lt;span class="s"&gt;"nome"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"idade"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"interesses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"programação"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"música"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"jogos"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;""";
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse exemplo ilustra a criação de uma string JSON formatada. A interpolação de string com quebras de linha facilita a inserção de valores dinâmicos em um template JSON, mantendo a legibilidade do código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo 4: Logs Detalhados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;logMessage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"""Evento de Erro:
&lt;/span&gt;&lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Now&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;Mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Acesso&lt;/span&gt; &lt;span class="n"&gt;negado&lt;/span&gt; &lt;span class="n"&gt;ao&lt;/span&gt; &lt;span class="n"&gt;tentar&lt;/span&gt; &lt;span class="n"&gt;conectar&lt;/span&gt; &lt;span class="n"&gt;ao&lt;/span&gt; &lt;span class="n"&gt;banco&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Detalhes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Verifique&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;permiss&lt;/span&gt;&lt;span class="err"&gt;õ&lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;usu&lt;/span&gt;&lt;span class="err"&gt;á&lt;/span&gt;&lt;span class="n"&gt;rio&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;tente&lt;/span&gt; &lt;span class="n"&gt;novamente&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;""";
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs detalhados e mensagens de erro podem se beneficiar enormemente deste recurso, permitindo a estruturação de informações complexas de forma legível e direta.&lt;/p&gt;

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

&lt;p&gt;A inclusão de quebras de linha em expressões de interpolação de string no C# 11 é uma daquelas melhorias que, apesar de pequenas, têm um impacto significativo na qualidade de vida do desenvolvedor. Ela simplifica o trabalho com strings formatadas, tornando o código mais limpo, fácil de ler e de manter. Este recurso é particularmente útil em aplicações que geram ou manipulam grandes quantidades de texto formatado, desde logs de sistema até geração dinâmica de código ou documentos.&lt;/p&gt;

&lt;p&gt;À medida que continuamos a explorar as novidades do C# 11, fica claro que cada recurso adicionado tem o potencial de melhorar significativamente a eficiência e a clareza do código. Fique ligado para mais insights e dicas sobre como tirar o máximo proveito dessas inovações em seus projetos de desenvolvimento.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>tutorial</category>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
  </channel>
</rss>
