<?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: William</title>
    <description>The latest articles on DEV Community by William (@william_io).</description>
    <link>https://dev.to/william_io</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%2F826132%2F5b20177c-8f6d-4710-8e4b-19c2a543eabc.jpeg</url>
      <title>DEV Community: William</title>
      <link>https://dev.to/william_io</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/william_io"/>
    <language>en</language>
    <item>
      <title>Como trabalhar com Records, Tipos Anônimos e Mutação não destrutiva</title>
      <dc:creator>William</dc:creator>
      <pubDate>Fri, 23 Sep 2022 12:00:07 +0000</pubDate>
      <link>https://dev.to/william_io/como-trabalhar-com-records-tipos-anonimos-e-mutacao-nao-destrutiva-2p5b</link>
      <guid>https://dev.to/william_io/como-trabalhar-com-records-tipos-anonimos-e-mutacao-nao-destrutiva-2p5b</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm56eeh731mc31ak2buxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm56eeh731mc31ak2buxd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fala Dev!!, hoje vou compartilhar alguns pontos relevantes que você pode fazer com os registros (&lt;strong&gt;Record&lt;/strong&gt;) e tipos anônimos. Vou mostrar também conceitos de mutação não destrutiva (&lt;strong&gt;non-destructive&lt;/strong&gt; ). E falar quando utilizar e por que usar esses recursos do C#.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;Qual é desse Record?&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Com o C# 9 podemos usar &lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/whats-new/tutorials/records" rel="noopener noreferrer"&gt;record&lt;/a&gt; que são um novo tipo de referência. Que você pode criar em vez de classes ou structs.&lt;/p&gt;

&lt;p&gt;O C# 10 introduziu a estrutura Record, para que você possa definir como tipos de valor. Os registros são distintos das classes em que os tipos usam igualdade baseada em valor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;em&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/builtin-types/value-types" rel="noopener noreferrer"&gt;Tipos de valor&lt;/a&gt;? vamos revisar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Veja no exemplo:&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;record&lt;/span&gt; &lt;span class="nc"&gt;Customer&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;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;Height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Está é a forma de declarar um record, chamado de registro posicional. Definido como construtor primário.&lt;/p&gt;

&lt;p&gt;As propriedades Name e Address são propriedades apenas de inicialização, o que significa que elas só podem ser definidas no construtor ou usando um inicializador de propriedade.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;Sobre Non-Destructive mutação usando a expressão With&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Não podemos modificar as propriedades do nosso record, porque as propriedades são apenas &lt;strong&gt;init&lt;/strong&gt;. No entanto, podemos usar a expressão &lt;strong&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/operators/with-expression" rel="noopener noreferrer"&gt;with (introduzida no C# 9)&lt;/a&gt;&lt;/strong&gt; para criar uma nova instância do nosso registro com valores modificados. &lt;/p&gt;

&lt;p&gt;Uma expressão with produz uma cópia de seu operando com as propriedades e campos especificados modificados&lt;/p&gt;

&lt;p&gt;Vejamos no exemplo:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;firstRegistration&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;Customer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"William"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1.70&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;changeSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;firstRegistration&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Height&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1.75&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fica ligado! ⚠️&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A instância &lt;strong&gt;firstRegistration&lt;/strong&gt; permanece inalterada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expressão with cria uma nova instância do record apenas com a propriedade Height modificada.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Como prometido que iria falar sobre Tipos Anônimos, então deixe-me mostrar algo surpreendente.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;Anonymous Types e Non-Destructive mutação:&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Você sabe como utilizar o &lt;strong&gt;expressão with&lt;/strong&gt; com tipos anônimos?&lt;/p&gt;

&lt;p&gt;Criando um tipo anonymous:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;secondRegistration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;Height&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1.90&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É assim que modificamos usando a expressão &lt;strong&gt;with&lt;/strong&gt;:&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;thirdRegistration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;secondRegistration&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt;  
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"João"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E novamente as mesmas regras se aplicam:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A instância original &lt;strong&gt;secondRegistration&lt;/strong&gt; permanece inalterada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A expressão with acaba criando uma nova instância de tipo anônimo onde temos apenas a propriedade &lt;strong&gt;Name&lt;/strong&gt; modificada.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Onde esté recurso pode ser útil? Utilizando métodos LINQ, Carregar um tipo anônimo do banco de dados em que alguma propriedade esteja em valor default. Você também pode está utilizando para calcular  valores dessas propriedades em memoria. Mais sobre &lt;a href="https://www.stevefenton.co.uk/2020/05/csharp-9-non-destructive-mutation/" rel="noopener noreferrer"&gt;non-destructive&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;br&gt;
Gostou da dica? Deixe seu like!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6v8rives2vb38t33sd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu6v8rives2vb38t33sd0.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Participe do nosso grupo: &lt;a href="https://discord.gg/pzU5sDBS6B" rel="noopener noreferrer"&gt;https://discord.gg/pzU5sDBS6B&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Vai pra cima DEV!!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Enviando Email com .NET 6 Web API</title>
      <dc:creator>William</dc:creator>
      <pubDate>Fri, 09 Sep 2022 13:43:02 +0000</pubDate>
      <link>https://dev.to/william_io/enviando-email-com-net-6-web-api-3i7</link>
      <guid>https://dev.to/william_io/enviando-email-com-net-6-web-api-3i7</guid>
      <description>&lt;p&gt;Neste artigo, vamos aprender como enviar um email no ASP.NET, Web API. Vamos começar com a criação do projeto [webapi]&lt;br&gt;
O que vamos utilizar no projeto?:  .NET 6.0 usando a &lt;a href="https://www.nuget.org/packages/MailKit/"&gt;MailKit&lt;/a&gt; de cliente de email.&lt;/p&gt;

&lt;p&gt;1 - no Projeto&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na pasta Endpoint/Email, está classe fará conexão e envio de um email para plataforma de teste o &lt;a href="https://ethereal.email/create"&gt;Ethereal&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;SendEmail.cs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lmsacg4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jo9yjo4l78sfnflmvvvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lmsacg4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jo9yjo4l78sfnflmvvvj.png" alt="Image description" width="648" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Saber mais sobre abordagem utilizando enpoints em vez de &lt;a href="https://ardalis.com/mvc-controllers-are-dinosaurs-embrace-api-endpoints/"&gt;controllers MVC&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=SDu0MA6TmuM"&gt;Nick Chapsas&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Program.cs&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ibHqvyeb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fe915n2ojs7ltv1j8hsn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ibHqvyeb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fe915n2ojs7ltv1j8hsn.png" alt="Image description" width="597" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ &lt;em&gt;Qual a vantagem de está utilizando endpoints em vez de controllers?&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ao trabalhar com ASP.NET Core API Endpoints, seu projeto não precisará de nenhuma classe Controller. Você pode organizar os Endpoints como quiser. Por recurso. Em uma pasta gigante do Endpoints. Não importa - eles funcionarão independentemente de onde você os colocar. &lt;a href="https://github.com/ardalis/ApiEndpoints#1-motivation"&gt;Saiba mais.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2 - Criando o objeto transferência de dados, o DTO para que seja injetado o IEmailService, onde vai ser colocado o body do email, o Connect e Authenticate. &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
