<?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: Tiago Henrique</title>
    <description>The latest articles on DEV Community by Tiago Henrique (@dvths).</description>
    <link>https://dev.to/dvths</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%2F844370%2F6635b8d9-1cc4-488a-b1dd-76bbfc3fe9b7.jpg</url>
      <title>DEV Community: Tiago Henrique</title>
      <link>https://dev.to/dvths</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dvths"/>
    <language>en</language>
    <item>
      <title>Me tornando um desenvolvedor .NET #1</title>
      <dc:creator>Tiago Henrique</dc:creator>
      <pubDate>Thu, 13 Oct 2022 10:54:44 +0000</pubDate>
      <link>https://dev.to/dvths/me-tornando-um-desenvolvedor-net-1-55e2</link>
      <guid>https://dev.to/dvths/me-tornando-um-desenvolvedor-net-1-55e2</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Neste segundo artigo, minha intenção é explorar os recursos iniciais de desenvolvimento .NET com a linguagem C#, uma linguagem moderna, orientada a objetos e fortemente tipada. Se você ainda não está completamente familiarizado com esta linguagem, não se preocupe, iremos nos aprofundar nos estudos cada vez mais.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/dvths/me-tornando-um-desenvolvedor-net-0-1n15"&gt;No artigo anterior&lt;/a&gt;, abordei alguns conceitos introdutórios sobre a plataforma, seus componentes e recursos. Eu recomendo que você o leia para poder compreender melhor, se for o caso, alguns pontos que irei abordar mais para frente. Vou considerar que já conhecemos basicamente o que é e para que serve o .NET, e que já temos o SDK (Software Development Kit) instalado.&lt;/p&gt;

&lt;p&gt;Eu estudo em um Arch Linux. Isso é importante destacar por duas razões: Primeiro: porque o IDE (Integrated Development Environment) Visual Studio, indicado para desenvolvimento .NET, não tem suporte para Linux. Apesar de um IDE possuir diversos recursos que facilitam o desenvolvimento, o &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt; dá conta do recado neste momento de aprendizado. Particularmente, eu uso &lt;a href="https://neovim.io/" rel="noopener noreferrer"&gt;Neovim&lt;/a&gt; com &lt;a href="https://docs.microsoft.com/en-us/visualstudio/extensibility/language-server-protocol?view=vs-2022" rel="noopener noreferrer"&gt;Language Server Protocol&lt;/a&gt; configurado. Segundo: eu começarei estudando a CLI (Command Line Interface) do dotnet, algo que um usuário do IDE usará poucas vezes no dia a dia. Portanto, alguns podem considerar irrelevante parte desse conteúdo e podem pular para o que achar mais relevante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Visão geral da CLI (Command Line Interface)&lt;/li&gt;
&lt;li&gt;Estrutura de comandos da CLI&lt;/li&gt;
&lt;li&gt;Estudando um aplicativo de console&lt;/li&gt;
&lt;li&gt;Fluxo de compilação&lt;/li&gt;
&lt;li&gt;Namespaces&lt;/li&gt;
&lt;li&gt;Arquivos de projeto e Entry Point&lt;/li&gt;
&lt;li&gt;Resumo&lt;/li&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Visão Geral da CLI
&lt;/h2&gt;

&lt;p&gt;A Interface de Linha de Comando do .NET é uma ferramenta multiplataforma para desenvolvimento, criação, execução e publicação de aplicações .NET e vem como parte do conjunto de recursos do SDK.&lt;/p&gt;

&lt;p&gt;Como a maioria das CLIs, a do .NET consiste no driver – um arquivo executável – opções e argumentos de comando. O driver (dotnet) tem basicamente as seguintes responsabilidades:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Executar programas:&lt;/strong&gt; abrange o fluxo de desenvolvimento, isto é, execução de testes, compilação do código e comandos de migração para atualizar projetos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gerenciar dependências:&lt;/strong&gt; abrange instalação, remoção, limpeza após a instalação de pacotes e atualização dos pacotes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criar e publicar pacotes:&lt;/strong&gt; abrange tarefas como criar um pacote compactado e efetuar um push do pacote para um registro, por exemplo (aos poucos veremos cada uma dessas coisas).&lt;/p&gt;

&lt;p&gt;Voltar aos tópicos&lt;/p&gt;




&lt;h2&gt;
  
  
  Estrutura de comando
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet &amp;lt;COMANDO&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;opções-do-comando] &lt;span class="o"&gt;[&lt;/span&gt;argumentos]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando passamos um comando para o executável (dotnet) inicia-se a execução daquele comando, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando constrói um projeto com suas dependências (também veremos como isso acontece mais para frente.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lista uma séries de opções de modelos pré preparados que você pode criar.&lt;/p&gt;

&lt;p&gt;Cada comando define suas próprias opções e argumentos e também possuem uma opção &lt;code&gt;--help&lt;/code&gt; muito útil quando se sentir perdido.&lt;/p&gt;

&lt;p&gt;Portanto, temos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comando:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Executa uma ação: compila o código, adiciona pacotes, referências ou publica o código (veremos mais para frente).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Argumentos:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Argumentos que você passa na linha de comando são aqueles do comando invocado. Por exemplo, quando você executa &lt;code&gt;dotnet publish my_app.csproj&lt;/code&gt;, o argumento &lt;code&gt;my_app.csproj&lt;/code&gt; indica que o projeto a ser publicado é passado para o comando publish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opções:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As opções são aquelas do comando invocado. Por exemplo:&lt;br&gt;
&lt;code&gt;dotnet publish --output /build_output&lt;/code&gt;, é a opção que indica o caminho da saída do aplicativo a ser publicado e esse valor é passado para o comando publish.&lt;/p&gt;

&lt;p&gt;Uma lista completa dos comandos do CLI .NET e seus detalhes pode ser consultados &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet?source=recommendations#dotnet-commands" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;, mas lembre-se sempre da opção &lt;code&gt;--help&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Voltar aos tópicos&lt;/p&gt;


&lt;h2&gt;
  
  
  Estudando um aplicativo de console
&lt;/h2&gt;

&lt;p&gt;Antes de iniciar um projeto, é importante saber que, ao instalar o SDK do .NET, recebemos dezenas de modelos pré preparados como aplicativos de console, bibliotecas de classes, projetos de testes unitários, aplicativos ASP.NET, etc. Para listar esses modelos disponíveis, como vimos acima, executamos o comando &lt;code&gt;dotnet new&lt;/code&gt; com a opção &lt;code&gt;-l&lt;/code&gt; ou &lt;code&gt;--list&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para iniciar um aplicativo de console, você pode executar:&lt;br&gt;
&lt;code&gt;$ dotnet new console.&lt;/code&gt; Contudo, você pode usar a opção &lt;code&gt;--help&lt;/code&gt; tanto após &lt;code&gt;new&lt;/code&gt; quanto após console para verificar as opções disponíveis para cada. Se fizer isso após o comando &lt;code&gt;new&lt;/code&gt;, verá que existem duas opções (-n e -o) ambas direcionam a saída gerada em um diretório nomeado por você. Portanto, se executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet new console &lt;span class="nt"&gt;-o&lt;/span&gt; HelloWorld
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verá que um diretório será criado com o valor passado para opção &lt;code&gt;-o&lt;/code&gt; , no caso, &lt;code&gt;HelloWorld&lt;/code&gt;. O mesmo o corre com a opção &lt;code&gt;n&lt;/code&gt;. Crie um projeto console chamado HelloWorld e dê uma espiada no que existe dentro dele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;tree HelloWorld
HelloWorld
├── HelloWorld.csproj
├── obj
│   ├── HelloWorld.csproj.nuget.dgspec.json
│   ├── HelloWorld.csproj.nuget.g.props
│   ├── HelloWorld.csproj.nuget.g.targets
│   ├── project.assets.json
│   └── project.nuget.cache
└── Program.cs

1 directory, 7 files

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

&lt;/div&gt;



&lt;p&gt;Essa é a estrutura básica do projeto e, durante o artigo, veremos o que são todos esses arquivos. Se abrirmos o arquivo &lt;code&gt;Program.cs&lt;/code&gt;, teremos a instrução clássica &lt;em&gt;Hello, World&lt;/em&gt;. Não é nenhuma novidade que, se executarmos esse código, a mensagem será impressa no console. Para fugir um pouco desse padrão, vamos começar tentando algo diferente.&lt;/p&gt;

&lt;p&gt;A maioria dos programas processa alguma entrada para produzir uma saída; basicamente essa é a definição de computação. Um programa obtêm dados de entrada de maneiras diversas, mas, com frequência, a entrada vem de uma fonte externa: um arquivo, uma conexão de rede, os dados da saída de outro programa ou de um usuário em um teclado. No arquivo &lt;code&gt;Program.cs&lt;/code&gt;, você pode apagar o que estiver escrito e colar o seguinte código:&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;namespace&lt;/span&gt; &lt;span class="nn"&gt;HelloWorld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&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;Main&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;args&lt;/span&gt;&lt;span class="p"&gt;)&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;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;@"./message.txt"&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;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Crie um arquivo e grave uma mensagem nele.&lt;/span&gt;
            &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;StreamWriter&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;message&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;"Olá, Mundo"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Leia o conteúdo do arquivo criado.&lt;/span&gt;
        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;StreamReader&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))&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;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&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;content&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="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;Não precisamos nos preocupar com a sintaxe do C#, nesse momento. Entretanto, o que este código faz é criar um arquivo no diretório atual chamado &lt;code&gt;message.txt&lt;/code&gt; e gravar nele a mensagem “Olá, Mundo!”, depois, enquanto existirem bytes para serem lidos, ele imprime no console o conteúdo desse arquivo. Quando isso se torna falso, o programa encerra.&lt;/p&gt;

&lt;p&gt;Muita coisa pode ser dita a respeito deste código. Por exemplo, no primeiro artigo conhecemos os conceitos de código gerenciado e não gerenciado e como o .NET trabalha com esses conceitos. &lt;code&gt;File&lt;/code&gt;, aqui, é um exemplo de tipo gerenciado que acessa recursos não gerenciados pelo CLR (no caso, cria um arquivo e o acessa no contexto do dispositivo). Note que o arquivo .txt foi criado na pasta atual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;tree &lt;span class="nt"&gt;-L&lt;/span&gt; 1
&lt;span class="nb"&gt;.&lt;/span&gt;
├── bin
├── message.txt
├── obj
├── Program.cs
└── HelloWorld.csproj

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

&lt;/div&gt;



&lt;p&gt;Há muitos outros tipos de recursos não gerenciados e tipos de biblioteca de classes que os encapsula.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;File&lt;/code&gt;, &lt;code&gt;StreamWriter&lt;/code&gt; e &lt;code&gt;StreamReader&lt;/code&gt;, são tipos que lidam com fluxos de dados permitindo leitura e gravação em arquivos definidos na biblioteca &lt;code&gt;IO&lt;/code&gt; (Input/Output) no &lt;strong&gt;namespace&lt;/strong&gt; &lt;code&gt;System.IO&lt;/code&gt; que fornece suporte básico a arquivos e diretórios do sistema operacional. O &lt;code&gt;Console.WriteLine()&lt;/code&gt; também é um tipo definido no namespace System, ou seja, &lt;code&gt;System.Console.WriteLine&lt;/code&gt;. Mas, não se preocupe pois, na próxima seção, veremos mais sobre namespaces.&lt;/p&gt;

&lt;p&gt;Se você estiver se perguntando o motivo de não ver nada relacionado a declaração de bibliotecas no código, eu te digo que nem sempre foi assim. Antes da versão 10 do C#, era necessário declarar namespaces individuais usando a diretiva &lt;code&gt;using&lt;/code&gt; no topo de cada arquivo, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Io&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Program&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;Mas o uso de alguns namespaces eram (e ainda são) muitos comuns, portanto, com a versão 10 do C# foi estabelecido as &lt;a href="https://github.com/dotnet/csharplang/blob/main/proposals/csharp-10.0/GlobalUsingDirective.md" rel="noopener noreferrer"&gt;diretivas globais de uso&lt;/a&gt;, que, entre outros detalhes, permitem ao compilador considerar certos namespaces para todo o projeto. Isso quer dizer que o SDK importa implicitamente os seguintes namespaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system?view=net-7.0" rel="noopener noreferrer"&gt;System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic?view=net-7.0" rel="noopener noreferrer"&gt;System.Collections.Generic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.io?view=net-7.0" rel="noopener noreferrer"&gt;System.IO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.linq?view=net-7.0" rel="noopener noreferrer"&gt;System.Linq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.net.http?view=net-7.0" rel="noopener noreferrer"&gt;System.Net.Http&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.threading?view=net-7.0" rel="noopener noreferrer"&gt;System.Threading&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks?view=net-7.0" rel="noopener noreferrer"&gt;System.Threading.Tasks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contudo, a diretiva &lt;code&gt;using&lt;/code&gt;, que veremos mais para frente, ainda é necessária para casos que fogem desse padrão.&lt;/p&gt;

&lt;p&gt;Mas, a ideia é entender o que vai acontecer agora: Execute &lt;code&gt;dotnet build&lt;/code&gt; e note que um novo diretório foi adicionado a raiz do projeto: &lt;code&gt;/bin&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin
└── Debug
    └── net6.0
        ├── HelloWorld
        ├── HelloWorld.deps.json
        ├── HelloWorld.dll
        ├── HelloWorld.pdb
        ├── HelloWorld.runtimeconfig.json
        └── ref
            └── HelloWorld.dll

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

&lt;/div&gt;



&lt;p&gt;Este é o produto resultante da construção do aplicativo. Aqui, temos o diretório &lt;strong&gt;Debug&lt;/strong&gt; que armazena um conjunto de arquivos binários, ou: &lt;strong&gt;Os assemblies de saída do programa&lt;/strong&gt;. Esse diretório inclui: o código do projeto em &lt;strong&gt;IL&lt;/strong&gt; (Intermediate Language) – vimos um pouco sobre isso no artigo anterior – com extensão &lt;code&gt;.dll&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;arquivos de símbolo de depuração, com uma extensão &lt;code&gt;.pdb&lt;/code&gt; (veremos logo, logo).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;um arquivo &lt;code&gt;.deps.json&lt;/code&gt;, que lista as dependências do aplicativo (ou biblioteca, se fosse o caso).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;um arquivo &lt;code&gt;.runtimeconfig.json&lt;/code&gt;, que especifica o tempo de execução compartilhado e sua versão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pode conter também outras bibliotecas das quais o projeto depende (por meio de   referências de projeto ou referências de pacote do &lt;strong&gt;NuGet&lt;/strong&gt; que veremos no   próximo artigo da série).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos ver esse programa funcionando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dotnet run

Olá, Mundo

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

&lt;/div&gt;



&lt;p&gt;Nesse ponto, você deve estar se perguntando sobre o diretório &lt;code&gt;obj&lt;/code&gt;. Se você reparou, um diretório &lt;strong&gt;Debug&lt;/strong&gt; também foi gerado lá e, entre outras coisas, também se encontram os &lt;strong&gt;assemblies&lt;/strong&gt; de saída do programa. A próxima pergunta que pode surgir é: Por que dois diretórios para a mesma coisa?&lt;/p&gt;

&lt;p&gt;Na verdade, não são necessariamente a mesma coisa. Os dois diretórios armazenam o código em IL, mas seus propósitos são distintos. E para deixar isso mais claro, precisamos entender o processo de compilação.&lt;/p&gt;

&lt;p&gt;Voltar aos tópicos&lt;/p&gt;




&lt;h2&gt;
  
  
  Fluxo de compilação
&lt;/h2&gt;

&lt;p&gt;Acontece que o uso coloquial da palavra “compilação” pode gerar certa confusão, pelo menos para mim que sou meio lento. Muitas vezes, nos referimos a compilação quando, na verdade, estamos nos referindo a &lt;strong&gt;build&lt;/strong&gt; (construção). Compilação não necessariamente é o mesmo que apenas gerar um arquivo executável. Em vez disso, é um processo de vários estágios que, de maneira geral, pode ser dividido em dois componentes: &lt;strong&gt;compilação&lt;/strong&gt; e &lt;strong&gt;linking&lt;/strong&gt;.&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%2Ftz67vo3cq0qy4dt3ljrb.jpg" 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%2Ftz67vo3cq0qy4dt3ljrb.jpg" alt="compilação e linking"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compilação&lt;/strong&gt; se refere ao processamento do código-fonte e a criação de arquivos “objeto”, que são unidades compiladas individuais. É no processo de compilação que também ocorre a análise sintática e léxica do código. Nesse ponto, se algo não estiver em conformidade com as  pecificações do &lt;strong&gt;CLS&lt;/strong&gt; ou &lt;strong&gt;CTS&lt;/strong&gt; (que vimos no artigo anterior), o processo é interrompido e um manipulador de erros integrado ao compilador envia uma notificação apontando o local do erro. Cada um desses arquivos objeto contém uma tradução do seu código-fonte em IL e são armazenados no diretório &lt;strong&gt;obj&lt;/strong&gt; – mas você não pode executá-los! Porque ainda é preciso transformá-los em executáveis que seu sistema operacional possa usar. É aí que entra o &lt;strong&gt;Linker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linking&lt;/strong&gt; (ou vinculação) refere-se à criação de um único arquivo executável a partir de vários arquivos objeto. Isso significa que todos esses arquivos de código são compilados em uma unidade &lt;strong&gt;assembly&lt;/strong&gt; armazenada em &lt;code&gt;/bin&lt;/code&gt; e, que, posteriormente, em tempo de execução, será &lt;strong&gt;interpretado&lt;/strong&gt; pelo compilador &lt;strong&gt;JIT&lt;/strong&gt;, fornecido pelo &lt;strong&gt;CLR&lt;/strong&gt;, da melhor maneira para se comunicar com as APIs do sistema operacional, como estudamos no artigo anterior.&lt;/p&gt;

&lt;p&gt;Por isso, esses arquivos de saída são divididos em &lt;code&gt;/obj&lt;/code&gt; e &lt;code&gt;/bin&lt;/code&gt;, mas também possuem um diretório chamado &lt;strong&gt;Debug&lt;/strong&gt;, pois, esse processo de compilação é feito de forma a facilitar a depuração.&lt;/p&gt;

&lt;p&gt;As informações de depuração, que facilitam o debug, são mapeadas naquele arquivo com extensão &lt;code&gt;.pdb&lt;/code&gt;. &lt;strong&gt;PDB&lt;/strong&gt; significa &lt;strong&gt;Program Database&lt;/strong&gt;, ele é gerado pelo Linker e consiste em uma estrutura de dados empregada pelo compilador onde cada identificador no código-fonte do programa é conectado com informações sobre sua declaração, seu tipo, nível de escopo e, em alguns casos, a sua posição.&lt;/p&gt;

&lt;p&gt;Os estágios de análise e síntese da compilação empregam informações a essa estrutura (também chamada de tabela de símbolos) para verificar se os identificadores usados foram especificados, para validar se as expressões e atribuições são semanticamente precisas e para construir o IL de destino. Em outras palavras, o arquivo &lt;code&gt;.pdb&lt;/code&gt; mapeia vários componentes e instruções no código-fonte para que o seu depurador possa usá-lo para localizar o arquivo de origem e o local do executável no qual ele deve interromper um processo de depuração. Sendo assim, seu programa é compilado com informações de depuração junto com os &lt;strong&gt;assemblies&lt;/strong&gt; e sem otimização. Porque a otimização complica a depuração, afinal de contas, a relação entre o código-fonte e as instruções de otimização geradas são bem mais complexas. Essa otimização, portanto, se faz necessária apenas quando queremos distribuir nossa aplicação, um processo chamado &lt;em&gt;release&lt;/em&gt;. Mas, estudaremos isso em outro momento.&lt;/p&gt;

&lt;p&gt;Com base no que acabamos de saber e no que estudamos no primeiro artigo, podemos fazer um desenho do processo de compilação que pode ser mais ou menos como este:&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%2Fvcqfcnyttvoyoa7axvjx.jpg" 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%2Fvcqfcnyttvoyoa7axvjx.jpg" alt="fluxo de compilação"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entendendo basicamente o processo de compilação e build, podemos entender melhor os namespaces.&lt;/p&gt;

&lt;p&gt;Voltar aos tópicos&lt;/p&gt;




&lt;h2&gt;
  
  
  Namespaces
&lt;/h2&gt;

&lt;p&gt;Você pode ter notado que ao criar o modelo &lt;code&gt;HelloWorld&lt;/code&gt; a única linha de código era &lt;code&gt;Console.WriteLine("Hello, World");&lt;/code&gt;. Mas o código da nossa implementação tem uma estrutura diferente, com algumas coisas a mais.&lt;/p&gt;

&lt;p&gt;Se olharmos apenas a estrutura do programa, em &lt;code&gt;Program.cs&lt;/code&gt;, veremos:&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;namespace&lt;/span&gt; &lt;span class="nn"&gt;HelloWorld&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&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;Main&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;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// code&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;Como vimos na seção anterior, um programa C# consiste em uma ou mais unidades de compilação, Certamente, eles dependerão uns dos outros para que o seu programa rode e, além disso, seu programa também dependerá de código de de bibliotecas que possuem suas próprias funcionalidades e que também geram suas próprias unidades de compilação. Como organizar isso e evitar ambiguidade? Como garantir que uma classe ou método não conflite com outra classe ou método que possui o mesmo nome, por exemplo? É por isso que existem os &lt;strong&gt;namespaces&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um &lt;strong&gt;namespace&lt;/strong&gt; é um agrupamento de tipos semanticamente relacionados contidos em um &lt;strong&gt;assembly&lt;/strong&gt; ou, possivelmente, espalhados em vários &lt;strong&gt;assemblies relacionados&lt;/strong&gt;. Por exemplo, o namespace &lt;code&gt;System.IO&lt;/code&gt;, que usamos em nosso exemplo, contém tipos relacionados a E/S de arquivo, o namespace &lt;code&gt;System.Console&lt;/code&gt; define tipos básicos que lidam com fluxos de E/S e erro padrão para aplicativos de console e assim por diante.&lt;/p&gt;

&lt;p&gt;É importante ressaltar que um único assembly pode conter &lt;em&gt;n&lt;/em&gt; namespaces, cada um dos quais pode conter &lt;em&gt;n&lt;/em&gt; tipos. A principal diferença entre essa abordagem e uma biblioteca de uma linguagem específica, como &lt;em&gt;nodeJs&lt;/em&gt;, por exemplo, é que para qualquer uma das linguagem de destino suportada pelo .NET, o tempo de execução usa os mesmos namespaces e os mesmos tipos, como vimos no artigo anterior quando falamos sobre o CTS e BCL. Contudo, para ficar mais claro, vamos ver um Hello World em C# e VB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//  C#.
using System;

public class MyApp
{
    static void Main()
    {
        Console.WriteLine("Hello C# World");
    }
}

//  VB.
Imports System
Public Module MyApp
  Sub Main()
    Console.WriteLine("Hi VB World")
  End Sub
End Module
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode observar que cada idioma está usando a classe Console definida no namespace System. Além das variações sintáticas óbvias, esses códigos são muito parecidos, tanto física quanto logicamente.&lt;/p&gt;

&lt;p&gt;Para resumir: A palavra-chave namespace é usada para declarar um escopo que contém um conjunto de códigos que se relacionam semanticamente entre si. Isso mantém a organização lógica do projeto e evita erros de compilação. Usar namespaces é uma boa prática e em C# é intensamente usado para duas coisas principalmente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Organização das inúmeras classes;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para controlar o escopo dos nomes de classe e de método em projetos maiores.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Conforme evoluirmos nos exemplos práticos ficará ainda mais claro.&lt;/p&gt;

&lt;p&gt;Caminhando para o final do nosso estudo, chegou a vez de olharmos para o arquivo de projeto: aquele com extensão &lt;code&gt;.csproj&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Voltar ao tópicos&lt;/p&gt;




&lt;h2&gt;
  
  
  Arquivos de projeto e Entry Point
&lt;/h2&gt;

&lt;p&gt;O arquivo &lt;code&gt;csproj&lt;/code&gt; também é chamado na documentação de &lt;strong&gt;arquivo de projeto MSBuild&lt;/strong&gt; e está no centro do processo de &lt;strong&gt;build&lt;/strong&gt; e implantação de um software .NET.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;MSBuild&lt;/strong&gt;, ou &lt;strong&gt;Microsoft Build Engine&lt;/strong&gt;, é o mecanismo que controla como a plataforma de compilação processa e compila um software. Tanto a CLI do .NET quanto a IDE Visual Studio, usam o MSBuild para criar os aplicativos incluindo um arquivo que reflete a &lt;em&gt;natureza&lt;/em&gt; do projeto, digamos assim. No caso do C#, o &lt;code&gt;.csproj&lt;/code&gt;, mas um projeto do Visual Basic será &lt;code&gt;.vbproj&lt;/code&gt;, um projeto de banco de dados, &lt;code&gt;.dbproj&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Trata-se de um documento &lt;strong&gt;XML&lt;/strong&gt; que contém todas as informações e instruções necessárias para construção do projeto, como os requisitos da plataforma, as informações de controle de versão, as configurações do servidor Web ou do servidor de banco de dados e as tarefas que devem ser executadas.&lt;/p&gt;

&lt;p&gt;Como desenvolvedores .NET, podemos criar nossos próprios arquivos de projeto msbuild, usando o esquema XML do MSBuild, para impor um controle sofisticado e refinado sobre como nossos projetos são criados e implantados. Contudo, um estudo mais aprofundado sobre isso ficará para um próximo artigo.&lt;/p&gt;

&lt;p&gt;O que precisamos compreender é que comando dotnet build usa esse mecanismo para compilar o projeto e dá suporte para compilações paralelas e incrementais. Isso é interessante para estudarmos mais detalhadamente o fluxo de compilação dos nossos projetos conforme eles se tornarem mais complexos.&lt;/p&gt;

&lt;p&gt;Em tempo, este conceito inicial é suficiente para entendermos porque é de onde vem o arquivo &lt;code&gt;.csproj&lt;/code&gt;. Se você quiser se aprofundar mais, pode acessar os links para os conteúdos usados como referência para esse artigo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por fim, mas não menos importante&lt;/strong&gt;, a dúvida: Como o Runtime sabe por ondecomeçar a executar o programa? A resposta objetiva está no método &lt;code&gt;Main()&lt;/code&gt;. Este é o primeiro método invocado quando seu projeto é executado. Ou seja, um programa deve ter apenas um método Main – também chamado de Entry Point do programa. No entanto, é até possível que uma aplicação tenha mais de um, só que antes de executá-lo, será necessário informar o compilador por qual começar.&lt;/p&gt;

&lt;p&gt;No próximo artigo vamos começar a praticar começando desenvolver exemplos com C# e .NET 6 e ver muito mais de todos esses conceitos na prática.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Este artigo complementou muitos dos conceitos estudados no artigo anterior, como CRL, CTS, BCL. Tivemos o primeiro contato com a CLI do .NET, estudamos a estrutura dos seus comandos. Também analisamos a estrutura de arquivos de um projeto e pudemos compreender, além dos seus significados, como estes arquivos interagem uns com os outros. Entramos em detalhes do fluxo de compilação e também tivemos um primeiro contato com a linguagem C#.&lt;/p&gt;

&lt;p&gt;Espero que este resumo te ajude de alguma forma. Não hesite em deixar seu feedback para melhorias ou correções.&lt;/p&gt;

&lt;p&gt;Até a próxima.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.guru99.com/compiler-tutorial.html" rel="noopener noreferrer"&gt;Compiler Design Tutorial for Beginners – Complete Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iq.opengenus.org/symbol-table-in-compiler/" rel="noopener noreferrer"&gt;Symbol Table in Compiler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lifewire.com/pdb-file-4153969" rel="noopener noreferrer"&gt;What Is a PDB File?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/botr/intro-to-clr.md" rel="noopener noreferrer"&gt;Introduction to the Common Language Runtime (CLR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/aspnet/web-forms/overview/deployment/web-deployment-in-the-enterprise/understanding-the-project-file#the-anatomy-of-a-project-file" rel="noopener noreferrer"&gt;A Anatomia de um Arquivo de Projeto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/aspnet/web-forms/overview/deployment/web-deployment-in-the-enterprise/understanding-the-project-file#msbuild-and-the-project-file" rel="noopener noreferrer"&gt;Noções básicas sobre o arquivo de projeto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild?view=vs-2022" rel="noopener noreferrer"&gt;MSBuild&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/program-structure/main-command-line" rel="noopener noreferrer"&gt;Main() e argumentos de linha de comando &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/tools/" rel="noopener noreferrer"&gt;CLI do .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/core/deploying/" rel="noopener noreferrer"&gt;Visão geral da publicação de aplicativos .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.amazon.com/Pro-NET-Foundational-Principles-Programming-ebook/dp/B0B85ZNWP6" rel="noopener noreferrer"&gt;Livro: "Pro C# 10 With .NET 6&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understanding the Common Type System - (part I, pág 13)&lt;/li&gt;
&lt;li&gt;Distinguishing Between Assembly, Namespace, and Type - (part I, pág 19)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AGRADECIMENTO:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/marcelocastelobranco/" rel="noopener noreferrer"&gt;&lt;strong&gt;Marcelo Castelo Branco&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voltar ao topo&lt;/p&gt;




</description>
      <category>dotnet</category>
      <category>programming</category>
      <category>beginners</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Me tornando um desenvolvedor .NET - #0</title>
      <dc:creator>Tiago Henrique</dc:creator>
      <pubDate>Thu, 08 Sep 2022 02:13:59 +0000</pubDate>
      <link>https://dev.to/dvths/me-tornando-um-desenvolvedor-net-0-1n15</link>
      <guid>https://dev.to/dvths/me-tornando-um-desenvolvedor-net-0-1n15</guid>
      <description>&lt;p&gt;&lt;strong&gt;No começo do mês de Agosto&lt;/strong&gt;, iniciei meus estudos do ecossistema .NET, o ambiente de desenvolvimento da Microsoft. Este e os próximos artigos representam meus esforços de aprendizado e a vontade de compartilhar conhecimento com quem também está começando.&lt;/p&gt;

&lt;p&gt;Este artigo, abrange conceitos que ainda estou compreendendo, portanto, está sujeito a falhas de interpretação ou nomenclatura. Contudo, há um grande esforço de checagem e validação das informações. Caso você encontre erros e/ou algo não tenha ficado claro o suficiente, por favor, não hesite em me procurar para que eu possa melhorar.&lt;/p&gt;

&lt;p&gt;Quero ressaltar que os conteúdos que serão publicados não possuem o objetivo de serem tutoriais, mas resumos dos meus estudos. Este &lt;em&gt;disclaimer&lt;/em&gt; se faz necessário, pois é possível que eu pule etapas consideradas mais básicas por já ter consolidado o conhecimento ou por não estarem no escopo. Por outro lado, como se trata de algo novo para mim, alguns temas de base serão abordados.&lt;/p&gt;

&lt;p&gt;Dito isso, gostaria de pedir, tanto para programadores iniciantes, como eu, quanto para aqueles com mais experiência, que se sintam a vontade par entrar em contato, tirar dúvidas, dar feedback ou contribuir para a melhoria do conteúdo. Só assim poderemos evoluir juntos.&lt;/p&gt;




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

&lt;p&gt;Há muito material online sobre a estrutura do ambiente de desenvolvimento da Microsoft. Neste artigo irei abordar o que considero mais relevante para compreensão desse ecossistema raro. Uso a palavra “raro” porque realmente existem poucos frameworks no mercado que oferecem tantas ferramentas integradas para desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;Tem me ajudado conhecer a plataforma mais afundo. Seus conceitos e funcionamento trazem um conhecimento rico que me esforço para resumir abordando os seguintes tópicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visão geral

&lt;ul&gt;
&lt;li&gt;Histórico do .NET - Importante para sabermos com o que estamos lidando.&lt;/li&gt;
&lt;li&gt;Componentes do ecossistema .NET &lt;/li&gt;
&lt;li&gt;CLR - COMMON LANGUAGE RUNTIME&lt;/li&gt;
&lt;li&gt;CLS - COMMON LANGUAGE SPECIFICATION&lt;/li&gt;
&lt;li&gt;CTS - COMMON TYPE SPECIFICATION&lt;/li&gt;
&lt;li&gt;BCL - BASE CLASS LIBRARY&lt;/li&gt;
&lt;li&gt;Processo de Execução Gerenciado&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Visão Geral: Histórico do .NET
&lt;/h2&gt;

&lt;p&gt;Como muitos sabem, .NET Framework foi criado na década de 1990, com o nome de NGWS (Next Generation Windows Services) para desenvolver aplicações da Microsoft. No fim de 2001, as primeiras versões beta do .NET foram lançadas e, em 2002, foi lançada a versão 1.0 trazendo o código gerenciado (veremos o que é isso mais pra frente) para o Windows NT 4.0, 98, 2000, ME, XP.&lt;/p&gt;

&lt;p&gt;Um longo caminho foi percorrido e a plataforma teve diversas versões, todas side-by-side (isto é, você pode ter várias versões instaladas trabalhando lado a lado). Até que, em 2014, a Microsoft passou por uma transição profunda no modelo de atuação que influenciou (e influencia até hoje) seus produtos: a saída de Steve Ballmer e a entrada de &lt;a href="https://codigofonte.com.br/noticias/leia-a-primeira-mensagem-de-satya-nadella-aos-funcionarios-da-microsoft"&gt;Satya Nadella como novo CEO da empresa&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Podemos dizer que Satya Nadella entendeu que a cultura monolítica, fechada e extremamente competitiva da Microsoft não era mais a adequada ao mercado cada vez mais volátil, mais focado em serviços e definitivamente integrado com soluções concorrentes. De uma grande caixa-preta, “ame-a ou deixe-a”, a Microsoft passou a vender a imagem de uma empresa que colabora com a comunidade de desenvolvimento, respeita seus adversários e permite que o consumidor misture produtos sem ficar preso ao seu ecossistema.&lt;/p&gt;

&lt;p&gt;Obviamente essa reestruturação iria se refletir na plataforma de desenvolvimento que já sofria com características limitadas de desenvolvimento multiplataforma, baixa performance e baixo suporte a arquitetura de microsserviços. Então, todo o esforço futuro do .NET Framework passou a ser endereçado ao projeto que ficou conhecido como .NET Core, um novo framework que seria desenvolvido do zero para dar suporte multiplataforma (Linux, MacOs) com a mesma ideia e recursos do irmão mais velho.&lt;/p&gt;

&lt;p&gt;Esse projeto começou em 2015 e até 2019 a empresa tinha 2 Frameworks no mercado, o .NET Framework, que era mais completo, mas rodava apenas em ambientes Windows e o .NET Core, que ainda estava em desenvolvimento, mas tinha suporte a outros sistemas operacionais.&lt;br&gt;
Com o lançamento do .NET Core 3, em 2019, o framework passou a suportar desenvolvimento de aplicações desktop, IA/Machine Learning e apps IoT. Era, então, apenas uma questão de tempo para uma nova grande mudança. E ela veio em 2020. &lt;/p&gt;

&lt;p&gt;Após o .NET Core 3.1, que já possuía quase todas as funcionalidades do .NET Framework e suporte multiplataforma, digamos que a Microsoft não viu mais sentido em manter dois frameworks e anunciou o .NET 5. O .NET Framework foi descontinuado (então não, não é uma versão posterior ao .NET Framework 4.x), e o .NET 5 se tornou o único a ser atualizado, justificando a remoção do nome “CORE” da marca. Portanto, o .NET 5 é a “unificação” do .NET Framework com o .NET Core.&lt;/p&gt;

&lt;p&gt;Com atualizações anuais, no mês de novembro, e versões pares com suporte LTS, já foram anunciadas as atualizações para .NET 7, esse ano (2022) e .NET 8 LTS (2023).&lt;/p&gt;

&lt;p&gt;Para nós, programadores, essa história significa o seguinte: Apesar das versões mais antigas não receberem mais atualizações, apenas correções de segurança e bugs, elas existem e algumas empresas ainda trabalham com código legado. Por isso a importância de saber com qual versão se está trabalhando e suas particularidades. Contudo, não faz o menor sentido iniciar novos projetos com versões anteriores ao .NET 5.&lt;br&gt;
Mas, ao que se dá o sucesso da plataforma de um ponto de vista operacional? Vamos entender melhor a arquitetura e seus componentes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Componentes .NET
&lt;/h2&gt;

&lt;p&gt;Ok, somos novos no ramo. Talvez nem tudo fique claro logo de cara. Mas imagine comigo: A primeira suposição que fazemos é que um programa é escrito em uma linguagem de programação específica. Logo descobrimos que todos os programas precisam de alguma biblioteca de tempo de execução que lhes permita interagir com os outros recursos da máquina (como entrada do usuário, arquivos de disco, comunicações de rede, etc). &lt;/p&gt;

&lt;p&gt;Para isso acontecer, o programa também precisa ser convertido de alguma forma (por interpretação ou compilação) para um formato que o hardware nativo possa executar diretamente. &lt;/p&gt;

&lt;p&gt;Então, esse programa direcionado para um formato específico de hardware, agora tem que se integrar com  outros programas escritos em outras linguagens que devem interagir, de alguma forma, com os mesmos ou com outros recursos de hardware… Um processador vai fazer o trabalho, mas cada CPU tem sua própria arquitetura.&lt;/p&gt;

&lt;p&gt;Bom, é aqui que a imaginação acaba, porque essas dependências são tão numerosas, interdependentes e diversas que os implementadores de linguagens de programação quase sempre direcionam seus esforços a uma arquitetura de hardware específica (por exemplo, X86) e a um ambiente de sistema operacional (por exemplo, Windows, Linux ou Mac OS), que possui uma especificação que descreve o formato do arquivo executável e especifica como ele será carregado. No fim das contas, os programadores não fazem um "executável C++", mas sim um "executável Windows X86" ou um "executável Power PC Mac OS". &lt;/p&gt;

&lt;p&gt;Haja abstração. Porém elas existem, ou você não estaria em um computador agora. Na verdade, a grande maioria dessas abstrações razoavelmente completas foi construída para linguagens únicas. Por exemplo, o tempo de execução Java, o interpretador Perl são exemplos.&lt;/p&gt;

&lt;p&gt;No começo do artigo, eu mencionei a palavra “raro” para me referir ao ambiente .NET, acho que agora, por contraste, vai ficar mais claro o que quis dizer:&lt;/p&gt;

&lt;p&gt;Não precisa de muito esforço para entender que especificar e implementar todos esses detalhes que imaginamos seja uma tarefa enorme. É aqui que entra o COMMON LANGUAGE RUNTIME e o motivo de ser muito raro.&lt;/p&gt;

&lt;p&gt;O CLR é a base onde os aplicativos .NET são construídos. É ele que gerencia tudo o que acontece por trás dos panos enquanto programamos. Uma definição seria: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;O Common Language Runtime (CLR) é uma máquina virtual completa e de alto nível projetada para suportar uma ampla variedade de linguagens de programação e interoperação entre elas.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Isso pode não ser muito esclarecedor quanto a sua raridade ou seu sucesso, por outro lado é um primeiro passo para agrupar seus recursos de maneira compreensível. É o que vou tentar fazer a seguir.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLR - COMMON LANGUAGE RUNTIME
&lt;/h2&gt;

&lt;p&gt;Para começar, o CLR não é bem-sucedido devido a qualquer recurso específico que ele suporta – como coleta de lixo, independência de plataforma, programação orientada a objetos ou suporte a versões (coisas que serão abordadas futuramente). O CLR é bem-sucedido porque todos esses recursos, assim como vários outros, se combinam para tornar a programação significativamente mais fácil, permitindo que diferentes linguagens se comuniquem entre si com construções de alto nível que reduzem drasticamente o trabalho de interoperação. &lt;/p&gt;

&lt;p&gt;Fácil aqui significa o seguinte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Linguagens simplificadas (por exemplo, C# e Visual Basic são significativamente mais simples que C++, linguagem geralmente usada na implementação de APIs dos sistemas operacionais)&lt;/li&gt;
&lt;li&gt;Uma dedicação à simplicidade na biblioteca de classes (por exemplo, temos apenas um tipo de string e é imutável; isso simplifica muito qualquer API que use strings)&lt;/li&gt;
&lt;li&gt;Forte consistência na nomenclatura na biblioteca de classes (por exemplo, exigindo que as APIs usem convenções de nomenclatura consistentes)&lt;/li&gt;
&lt;li&gt;Ótimo suporte na cadeia de ferramentas necessária para criar um aplicativo (por exemplo, o Visual Studio torna a criação de aplicativos CLR muito simples e o Intellisense facilita muito a localização dos tipos e métodos corretos para criar o aplicativo).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A partir desse conhecimento, podemos fazer um primeiro desenho dos componentes básicos gerenciados pelo CLR da seguinte forma: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tM8Ho86Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qcekx2c6itxmq78mkksz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tM8Ho86Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qcekx2c6itxmq78mkksz.jpg" alt="Componentes gerenciados pelo CLR" width="880" height="808"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na primeira camada (de cima para baixo) temos as linguagens de programação cujos compiladores são suportadas pelo runtime. Logo abaixo temos as especificações de tipo e de linguagem.&lt;/p&gt;

&lt;h3&gt;
  
  
  CTS - COMMON TYPES SPECIFICATION
&lt;/h3&gt;

&lt;p&gt;O CTS descreve um conjunto de tipos de dados que podem ser usados por diferentes linguagens comuns ao .Net (ou seja, na prática, o CTS garante que eu possa escrever uma classe em Python, por exemplo, e derivar dela em C#).&lt;/p&gt;

&lt;p&gt;Para comunicação entre programas escritos em qualquer linguagem suportada pelo .NET (mais de 50 linguagens) os tipos têm que ser compatíveis no nível básico, isto é, o sistema deve suportar duas categorias:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipos de valor&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Onde os objetos são representados por seus valores. Se você atribuir um tipo de valor a uma variável, estará essencialmente copiando um valor do objeto. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipos de referência:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os tipos de referência são representados por uma referência ao valor real do objeto. Ele simplesmente se refere a um local de memória onde estão os valores dos objetos. Isso tem um impacto profundo em como esses tipos são usados. Se você atribuir um tipo de referência a uma variável e, em seguida, passar essa variável para um método, por exemplo, quaisquer alterações no objeto serão refletidas no objeto principal; não há cópia. &lt;/p&gt;

&lt;p&gt;O CTS também define todas as outras propriedades dos tipos, como modificadores de acesso, quais são os membros de tipo válidos, como a herança e a sobrecarga funcionam e assim por diante. Infelizmente, meu conhecimento ainda não vai muito além disso, então falarei mais profundamente em um outro artigo.&lt;/p&gt;

&lt;h3&gt;
  
  
  CLS - COMMON LANGUAGE SPECIFICATION
&lt;/h3&gt;

&lt;p&gt;O CLS é um subconjunto do CTS. Isso significa que todas as regras do CTS também se aplicam ao CLS, a menos que as regras do CLS sejam mais rígidas. Entretanto, é o CLS que fornece uma espécie de receita semântica para qualquer linguagem que seja implementada. Em outras palavras, o CLS define uma série de regras semânticas que são compartilhadas entre as linguagens com o objetivo de garantir interoperabilidade completa entre elas. &lt;/p&gt;

&lt;h3&gt;
  
  
  Frameworks de Desenvolvimento
&lt;/h3&gt;

&lt;p&gt;Na próxima camada, temos os frameworks de desenvolvimento .Net. Eu não entrarei no detalhes de todos. Eu tenho me dedicado a entender mais profundamente o ASP.NET. É dele que falarei mais em artigos futuros, no entanto a definição de cada plataforma pode ser:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WinForms&lt;/strong&gt; – uma estrutura para criação de interface do usuário que cria aplicativos cliente de desktop avançados para Windows. A plataforma de desenvolvimento do Windows Forms oferece suporte a um amplo conjunto de recursos de desenvolvimento de aplicativos, incluindo controles, gráficos e vinculação de dados e entrada do usuário.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ASP.NET&lt;/strong&gt; – É usado para desenvolver aplicativos baseados na web, desde sites usando HTML, CSS e Javascript até APIs Web, além de facilitar o uso de tecnologias em tempo real como Web Sockets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADO.NET&lt;/strong&gt; – é um conjunto de classes que expõe serviços de acesso a dados para programadores do .NET Framework. O ADO.NET fornece um rico conjunto de componentes para a criação de aplicativos distribuídos de compartilhamento de dados. &lt;/p&gt;

&lt;h3&gt;
  
  
  BCL - BASE CLASS LIBRARY
&lt;/h3&gt;

&lt;p&gt;Por fim, mas não menos importante, a BCL. Uma coleção de métodos e funções que podem ser usados ​​para o propósito da aplicação. A estrutura .NET fornece um conjunto de bibliotecas de classes básicas com diversos recursos que podem ser usados ​​por qualquer linguagem de programação que implemente .NET.&lt;/p&gt;

&lt;p&gt;Por exemplo, existe uma biblioteca de classes com métodos para lidar com todas as operações em nível de arquivo. Portanto, existe um método que pode ser usado para ler o texto de um arquivo. Da mesma forma, existe um método para escrever texto em um arquivo.&lt;/p&gt;

&lt;p&gt;A maioria dos métodos é dividida nos namespaces System.* ou Microsoft.*. (o asterisco significa apenas uma referência a todos os métodos que se enquadram no namespace System ou Microsoft).&lt;/p&gt;

&lt;p&gt;Um namespace é uma separação lógica de métodos. Veremos mais detalhes sobre namespaces em um próximo estudo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Processo de Execução Gerenciado
&lt;/h2&gt;

&lt;p&gt;Juntando tudo que vimos: o CLR tem a característica matadora de ser multilingue. Cada linguagem/compilador que é suportado pelo ecossistema e que se beneficie do CLR é chamado de &lt;strong&gt;código gerenciado&lt;/strong&gt; (Porque é gerenciado pelo CLR), do contrário é chamado de &lt;strong&gt;código não gerenciado&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;O código gerenciado, no caso do .NET, permite que objetos escritos em diferentes linguagens possam se comunicar uns com os outros e seus comportamentos podem ser fortemente integrados. Por exemplo: você pode definir uma classe em C# e usar uma linguagem diferente para derivar dessa classe ou chamar um método definido nela, ou pode passar uma instância de uma classe para um método de uma classe escrita em um idioma diferente.&lt;/p&gt;

&lt;p&gt;O CLR é capaz disso por possuir especificações de tipagem e semântica que garantem que, no fim das contas, não compilamos um “código C# ” e sim um código que irá implementar as APIs da arquitetura da SO. Veremos agora como isso é possível:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QMLhNn3C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ce38ywgupgqm3fd9n49r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QMLhNn3C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ce38ywgupgqm3fd9n49r.jpg" alt="Processo de execução gerenciada" width="880" height="1109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada linguagem suportada pelo CLR possui suas ferramentas, entre elas está o seu compilador. O compilador da linguagem que você usa determina quais recursos de tempo de execução estão disponíveis e você projeta seu código usando esses recursos. Seu compilador, &lt;strong&gt;não o tempo de execução&lt;/strong&gt;, estabelece a sintaxe que seu código deve usar (conforme as especificações de tipo e linguagem). &lt;/p&gt;

&lt;p&gt;Quando seu código é compilado, é gerado um arquivo chamado de &lt;strong&gt;Assembly&lt;/strong&gt;. Os assemblies são usados para os próprios programas, bem como para quaisquer bibliotecas dependentes. É um formato de arquivo binário totalmente especificado e padronizado pela &lt;a href="https://www.ecma-international.org/publications-and-standards/standards/ecma-335/"&gt;ECMA 335&lt;/a&gt;. Todos os compiladores de linguagem suportados pelo .NET usam esse formato.&lt;/p&gt;

&lt;p&gt;Entretanto, na prática, um assembly é o produto da compilação do seu código escrito em C#, VB, F#, etc. em uma linguagem intermediária chamada de &lt;strong&gt;MSIL (Microsoft Intermediate Language)&lt;/strong&gt;. Uma linguagem intermediária independente do CPU, isto é, ainda não é a linguagem de máquina (&lt;strong&gt;código nativo ou não gerenciado&lt;/strong&gt;), mas uma linguagem desenvolvida para se comunicar da melhor maneira com as APIs fornecidas pela arquitetura do sistema operacional. &lt;/p&gt;

&lt;p&gt;O MSIL inclui instruções para carregar, armazenar, inicializar e chamar métodos em objetos, bem como instruções para operações aritméticas e lógicas, fluxo de controle, acesso direto à memória, tratamento de exceção e outras operações.&lt;/p&gt;

&lt;p&gt;Quando esse binário é executado, ele passa por uma outra compilação, dessa vez, por um dos &lt;strong&gt;compiladores JIT (Just-in-Time)&lt;/strong&gt; que também são fornecidos pelo CLR. Esse tipo de compilador traduz, &lt;strong&gt;em tempo de execução&lt;/strong&gt;, o código intermediário em código nativo específico para aquele CPU. &lt;/p&gt;

&lt;p&gt;Ser traduzido em tempo de execução significa o seguinte: O compilador JIT converte o código intermediário em código nativo durante a execução do programa sob-demanda.&lt;/p&gt;

&lt;p&gt;Isso, por sua vez, quer dizer que a compilação JIT leva em consideração a possibilidade de que algum código nunca seja chamado durante a execução. Logo, em vez de usar tempo e memória para converter todo o MSIL em código nativo, ele o converte conforme necessário durante a execução e armazena o código nativo resultante na memória para que seja acessível para chamadas subsequentes no contexto desse processo.&lt;/p&gt;

&lt;p&gt;Outros processos ocorrem nesse momento, por exemplo, um compilador &lt;strong&gt;JIT também otimiza o código a cada execução.&lt;/strong&gt;. Ou seja, toda vez que o IL é executado, o compilador o torna mais eficaz. É possível que você ouça de um desenvolvedor mais experiente uma expressão do tipo: “Vamos esperar o código esquentar”. Agora você sabe que ele está fazendo referência à otimização do código a cada execução ;)&lt;/p&gt;

&lt;p&gt;Também existem diferentes tipos de compilação JIT, no entanto, fogem um pouco do escopo deste artigo e serão abordados com mais detalhes nos próximos que desejo publicar sobre o assunto.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Para concluirmos esse conteúdo introdutório&lt;/strong&gt;, o CRL, além de gerenciar todos esses componentes, possui muitos outros recursos, por isso é útil categorizá-los da seguinte forma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Recursos fundamentais&lt;/strong&gt; – Recursos que têm amplo impacto no design de outros recursos. Esses incluem:

&lt;ol&gt;
&lt;li&gt;Coleta de lixo&lt;/li&gt;
&lt;li&gt;Segurança de memória e segurança de tipo&lt;/li&gt;
&lt;li&gt;Suporte de alto nível para linguagens de programação.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursos secundários&lt;/strong&gt; – Recursos habilitados pelos recursos fundamentais que podem não ser exigidos:

&lt;ol&gt;
&lt;li&gt;Isolamento de programa com AppDomains&lt;/li&gt;
&lt;li&gt;Segurança do programa e sandboxing&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outros recursos&lt;/strong&gt; – recursos que todos os ambientes de tempo de execução precisam, mas que não aproveitam os recursos fundamentais do CLR. Em vez disso, eles são o resultado do desejo de criar um ambiente de programação completo. Entre eles estão:

&lt;ol&gt;
&lt;li&gt;Controle de versão&lt;/li&gt;
&lt;li&gt;Depuração/Perfil&lt;/li&gt;
&lt;li&gt;Interoperação&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para os próximos artigos eu irei me aprofundar um pouco mais em alguns desses recursos. Por agora, podemos resumir o Runtime do .NET como uma especificação completa dos bits exatos que se deve colocar em um arquivo para criar e executar um programa. É uma máquina virtual que executa esses arquivos e está em um alto nível de abstração apropriado para implementar uma ampla classe de linguagens de programação. Essa máquina virtual, juntamente com um corpo cada vez maior de bibliotecas de classes, é o que define o COMMON LANGUAGE RUNTIME.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;FONTES:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/clr"&gt;Visão geral do Common Language Runtime (CLR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/botr/intro-to-clr.md"&gt;Introdução ao Common Language Runtime (CLR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/core/introduction"&gt;O que é .NET? Introdução e Visão geral&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/language-independence"&gt;Independência de idioma e componentes independentes de idioma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/assembly/file-format"&gt;Formato de arquivo de montagem .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/managed-execution-process#choosing_a_compiler"&gt;Processo de execução gerenciada&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/class-libraries"&gt;Bibliotecas de classe .NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AGRADECIMENTO:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/marcelocastelobranco/"&gt;&lt;strong&gt;Marcelo Castelo Branco&lt;/strong&gt;&lt;/a&gt;, Engenheiro de Software Sênior na XP.inc. primeiro pela paciência, depois pela didática: sempre trazendo exemplos das minhas experiências passadas para essa nova empreitada. E por se dispor a me mentorear e se comprometer com minha evolução! Valeu, cara! &lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>beginners</category>
      <category>programming</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Estude e pesquise melhor com essas extensões</title>
      <dc:creator>Tiago Henrique</dc:creator>
      <pubDate>Mon, 23 May 2022 01:41:26 +0000</pubDate>
      <link>https://dev.to/dvths/estude-e-pesquise-melhor-com-essas-extensoes-23g2</link>
      <guid>https://dev.to/dvths/estude-e-pesquise-melhor-com-essas-extensoes-23g2</guid>
      <description>&lt;p&gt;Uma das coisas mais importantes - talvez a mais importante - na vida de uma pessoa é saber aprender. Se você está no início da carreira de pessoa desenvolvedora de software, como eu, imagino que já deve ter percebido que aprender é algo que você nunca mais vai parar de fazer. Imagino também que isso não deve ser problema para você. Talvez o problema esteja em torno da busca pelo melhor método (se é que existe), das prioridades, do tempo e, muito provavelmente, das melhores ferramentas. Estamos no mesmo barco.&lt;/p&gt;

&lt;p&gt;Eu venho do jornalismo e, guardadas as proporções, uma das coisas que aprendi é que é extremamente difícil lidar com quantidades grandes de informação sem método e sem ajuda. Parece óbvio, mas o fato é que, de vez em quando, esquecemos disso. Então resolvi começar esse blog: para compartilhar com a comunidade um pouco das minhas experiências com o estudo e gerenciamento da informação expondo meu aprendizado na área de tecnologia buscando feedbacks construtivos.&lt;/p&gt;

&lt;p&gt;Para chutar essa bola para frente, esse post traz uma lista de extensões interessantes para Google Chrome que uso no meu dia-a-dia no curso. Algumas eu conheci recentemente e outras eu já conhecia desde que trabalhava apurando e escrevendo histórias. &lt;/p&gt;

&lt;p&gt;Eu não vou entrar no detalhe de todas, você pode acessar a página de cada uma delas, testar e tirar suas conclusões.&lt;/p&gt;

&lt;p&gt;Talvez você conheça algumas (ou todas!), mas se souber de outras que possa compartilhar, todos e todas irão agradecer!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://chrome.google.com/webstore/detail/volume-master/jghecgabfgfdldnmbfkhmffcabddioke?hl=pt-BR"&gt;1. Volume Master&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Permite que você aumente o som de qualquer vídeo para até 600%. Para aqueles casos em que seu professor fala baixo demais ou se seu fone ficou zoado!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://chrome.google.com/webstore/detail/blackbox-select-copy-past/mcgbeeipkmelnpldkobichboakdfaeon?hl=pt-BR"&gt; 2. BlackBox (essa surpreende!)&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Pare de encher o saco do seu professor pedindo para ele mandar o link do "PPT" no chat (nada contra...). Com blackbox você printa o vídeo e ele converte automaticamente para texto! Ele faz isso com qualquer vídeo!!&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://chrome.google.com/webstore/detail/youtube-speed-controls/naalfmaaomhjpbndelnlijacdniggpjn"&gt;3. YouTube Speed Control&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Deixa mais fácil controlar a velocidade dos vídeos do YouTube.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall?hl=pt-BR"&gt;4. OneTab&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;50 mil abas abertas? Nem agrupando resolve? Essa fecha todas as abas, salva e deixa tudo organizado. Economiza memória e você não se perde.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://chrome.google.com/webstore/detail/gofullpage-full-page-scre/fdpohaocaechififmbbbbbknoalclacl"&gt;5. GoFullPage&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Printa tudo na tela, até o que não cabe num print normal e ainda exporta para pdf.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://chrome.google.com/webstore/detail/mendeley-web-importer/dagcmkpagjlhakfdhnbomgmjdpkdklff"&gt;6. Mendeley Web Importer &lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Está pesquisando um tema? Ou se interessa por um e quer juntar tudo o que achar a respeito daquilo? Use o Mendeley, para mim o melhor agregador de referências e merece um post inteiro sobre... vou fazer depois.&lt;/p&gt;

&lt;p&gt;E aí já deu uma olhada? Conta as que você usa. Nos próximos posts eu pretendo trazer mais algumas e falar sobre métodos de estudo e outras coisas.&lt;br&gt;
Até! &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
