<?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: Bea Tavernaro</title>
    <description>The latest articles on DEV Community by Bea Tavernaro (@bea_tavernaro).</description>
    <link>https://dev.to/bea_tavernaro</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1061108%2F70184e11-07b9-4392-a160-62b20fed0738.jpg</url>
      <title>DEV Community: Bea Tavernaro</title>
      <link>https://dev.to/bea_tavernaro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bea_tavernaro"/>
    <language>en</language>
    <item>
      <title>NuGet and what's behind your dependencies</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Thu, 15 Oct 2026 20:21:39 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/nuget-and-whats-behind-your-dependencies-594e</link>
      <guid>https://dev.to/bea_tavernaro/nuget-and-whats-behind-your-dependencies-594e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇧🇷 Prefere ler em português? &lt;a href="https://dev.to/bea_tavernaro/nuget-e-o-que-existe-por-tras-das-dependencias-c3e"&gt;Leia aqui&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Over the last three days of my &lt;strong&gt;30 Days of .NET&lt;/strong&gt;, we &lt;a href="https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi"&gt;saw what happens when we run &lt;code&gt;dotnet run&lt;/code&gt;&lt;/a&gt;, explored the &lt;a href="https://dev.to/bea_tavernaro/what-does-the-csproj-file-tell-you-about-your-net-project-5dhd"&gt;structure of a .NET project&lt;/a&gt;, and learned how to &lt;a href="https://dev.to/bea_tavernaro/a-day-without-visual-studio-using-only-the-net-cli-3cg0"&gt;use the CLI&lt;/a&gt; without relying on Visual Studio.&lt;/p&gt;

&lt;p&gt;But there's something that shows up in pretty much every real-world project and that we tend to handle on autopilot: NuGet packages.&lt;/p&gt;

&lt;p&gt;When we need some functionality, we look for a library that solves our problem, install the package, and keep developing. I've done this countless times myself without thinking too much about what was happening behind that installation, especially when the package is well-known and used by thousands of other developers. By the way, be careful with that.&lt;/p&gt;

&lt;p&gt;The thing is, installing a package doesn't necessarily mean adding just one library to our project. Sometimes we're bringing in several other dependencies along with it, and we don't always know what they are or where they came from.&lt;/p&gt;

&lt;p&gt;So today, we're going to take a closer look at how NuGet works, where these dependencies come from, and how we can check whether the packages we're using are up to date and secure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is NuGet?
&lt;/h2&gt;

&lt;p&gt;NuGet is the package manager for the .NET ecosystem. It allows developers to distribute, share, and reuse libraries across different projects, making dependency management easier. If you've worked with JavaScript or Python, you can think of it as the equivalent of &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;pip&lt;/code&gt;. These packages can be made available through different sources, with &lt;a href="https://www.nuget.org/" rel="noopener noreferrer"&gt;NuGet.org&lt;/a&gt; being the most well-known public repository.&lt;/p&gt;

&lt;p&gt;If we open the &lt;a href="https://www.nuget.org/packages/Dapper" rel="noopener noreferrer"&gt;Dapper page on NuGet.org&lt;/a&gt;, for example, we can find information about the package, its available versions, the frameworks it's compatible with, its dependencies, and links to its repository and documentation. It's worth taking a look at this information before installing a library, especially to check whether it meets our project's needs and to better understand what we're adding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmrghrujozy441yqbex0o.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmrghrujozy441yqbex0o.png" alt="Dapper page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On &lt;a href="https://dev.to/bea_tavernaro/what-does-the-csproj-file-tell-you-about-your-net-project-5dhd"&gt;Day 02&lt;/a&gt;, we saw that we can add Dapper to our project using the terminal. After installation, the package appears in our &lt;code&gt;.csproj&lt;/code&gt; through a &lt;code&gt;PackageReference&lt;/code&gt;, which tells .NET which dependency we're using and which version was declared for the project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ownxbnmn1bhvl8fb6si.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ownxbnmn1bhvl8fb6si.png" alt="Dapper at csproj"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So far, it seems pretty simple, but there's an important part of this process that isn't always visible when we only look at the &lt;code&gt;.csproj&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies That Bring Other Dependencies
&lt;/h2&gt;

&lt;p&gt;When we install a NuGet package, we might be adding much more than the library we chose. A package can also depend on other packages to work properly, and those packages can have their own dependencies, and so on.&lt;/p&gt;

&lt;p&gt;This is where we need to understand the difference between &lt;strong&gt;direct and transitive dependencies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo4ywog0uhcrqfirkhd3w.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo4ywog0uhcrqfirkhd3w.png" alt="Dapper dependencies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A direct dependency is one that we explicitly add to our project, like we did with Dapper. A transitive dependency, on the other hand, is one that becomes part of the project because another package needs it to work.&lt;/p&gt;

&lt;p&gt;We can view these dependencies using the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet package list --include-transitive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpj2hvu42q5urgvg637rw.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpj2hvu42q5urgvg637rw.png" alt="Result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result shows the top-level packages, which are the direct dependencies, and the transitive packages used by the project. Depending on the libraries installed, this list can be huge.&lt;/p&gt;

&lt;p&gt;And why does this matter so much?&lt;/p&gt;

&lt;p&gt;Because when we add a dependency to our project, we're also trusting, to some extent, the packages it depends on. This doesn't mean transitive dependencies are bad. After all, they're a normal part of how package managers work, but we need to understand that they're also part of our application.&lt;/p&gt;

&lt;p&gt;An example of how this can become a problem happened in March 2026, involving Axios, a package widely used to make HTTP requests in JavaScript applications.&lt;/p&gt;

&lt;p&gt;In this case, an attacker managed to publish compromised versions of Axios on npm. These versions included a new dependency called &lt;code&gt;plain-crypto-js&lt;/code&gt;, which contained malicious code. So anyone installing one of the affected versions could end up bringing in and executing that code without ever choosing to install the malicious package directly.&lt;/p&gt;

&lt;p&gt;The incident was documented by the &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package" rel="noopener noreferrer"&gt;Google Threat Intelligence Group&lt;/a&gt; and is an example of a software supply chain attack.&lt;/p&gt;

&lt;p&gt;Although it happened in the npm ecosystem, this example helps us understand a risk that also exists in NuGet and other package managers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's not enough to know just the library we're installing. We also need to consider the dependencies that come along with it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet restore&lt;/code&gt; — Where Do Packages Come From?
&lt;/h2&gt;

&lt;p&gt;Now that we know a package can depend on several others, another question comes up: how does .NET find all these dependencies and get our project running? We can use the &lt;code&gt;dotnet restore&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet restore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we run this command, .NET analyzes the dependencies declared in the project, resolves which versions need to be used, and checks the configured package sources to find what's needed.&lt;/p&gt;

&lt;p&gt;NuGet also uses a &lt;strong&gt;global packages cache&lt;/strong&gt;, which is usually stored in the &lt;code&gt;.nuget/packages&lt;/code&gt; folder inside the user's directory. This means that if a package version has already been downloaded, it can be reused by other projects without needing to download it again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wjqtgqftwf9lm11dxtf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wjqtgqftwf9lm11dxtf.gif" alt="Smart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That's why we don't need to commit all the libraries used by our application to Git. When someone else clones our repository, .NET can read the declared dependencies and restore the required packages, as long as it has access to the sources where they're available.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How Can We Tell if Our Dependencies Are Up to Date and Secure?
&lt;/h2&gt;

&lt;p&gt;Installing a library and never looking at it again might seem harmless, especially when everything keeps working, but the packages we use also receive updates, bug fixes, and security vulnerability fixes.&lt;/p&gt;

&lt;p&gt;Using the .NET CLI, we can identify packages that need these updates without having to visit each package's NuGet page. The &lt;code&gt;dotnet package list --outdated&lt;/code&gt; command shows which packages have newer versions available:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feysb0im5sscqa6zi7tjj.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feysb0im5sscqa6zi7tjj.png" alt="Result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command compares the packages used by the project with the versions available from the configured sources and shows which ones can be updated.&lt;/p&gt;

&lt;p&gt;But there's an important difference between a package being outdated and a package being vulnerable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not every older version has a security issue, and not every update needs to be applied immediately, since some updates can introduce changes that are incompatible with our code.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet package list &lt;span class="nt"&gt;--vulnerable&lt;/span&gt; &lt;span class="nt"&gt;--include-transitive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command above checks vulnerability information available from audit sources and shows the affected packages, allowing us to identify issues that need attention.&lt;/p&gt;

&lt;p&gt;And this is where it's worth remembering the Axios case we saw earlier. These checks are important, but they don't mean we're completely protected against every malicious package. They depend on vulnerabilities that have already been identified and recorded, &lt;strong&gt;&lt;em&gt;so a recently compromised package might not show up in any of these checks yet.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That's why keeping our dependencies secure doesn't simply mean updating everything to the latest version or running a command every once in a while.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We need to evaluate which libraries we're using, keep track of important updates, and understand the impact these dependencies can have on our application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;In the rush of development, it's very easy to install a package to solve a problem and never think about it again. If the library works, the project builds, and the feature is done, we usually move on to the next task without paying much attention to what was added.&lt;/p&gt;

&lt;p&gt;But today we saw that there's quite a lot happening behind a simple installation. NuGet needs to resolve dependencies, find the required packages, restore their files, and make sure everything is available for the build process. And as Uncle Ben would say, "With great power comes great responsibility." That convenience of having ready-made code comes with the responsibility of keeping track of the libraries we use.&lt;/p&gt;

&lt;p&gt;We don't need to be suspicious of every package we install, but understanding where our dependencies come from and how we can check their status is already an important step toward keeping our projects safer and easier to maintain.&lt;/p&gt;

&lt;p&gt;Oh, and it's worth checking out the &lt;a href="https://www.nuget.org/stats" rel="noopener noreferrer"&gt;NuGet statistics page&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;See you tomorrow!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/" rel="noopener noreferrer"&gt;NuGet documentation — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders" rel="noopener noreferrer"&gt;Managing the global packages and cache folders — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/concepts/auditing-packages" rel="noopener noreferrer"&gt;Auditing NuGet packages — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package" rel="noopener noreferrer"&gt;North Korea-Nexus Threat Actor Compromises Widely Used Axios NPM Package — Google Cloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>NuGet e o que existe por trás das dependências</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Thu, 15 Oct 2026 20:18:16 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/nuget-e-o-que-existe-por-tras-das-dependencias-c3e</link>
      <guid>https://dev.to/bea_tavernaro/nuget-e-o-que-existe-por-tras-das-dependencias-c3e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇺🇸 Prefer reading in English? Read the &lt;a href="https://dev.to/bea_tavernaro/nuget-and-whats-behind-your-dependencies-594e"&gt;English version here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nos últimos três dias dos meus &lt;strong&gt;30 dias de .NET&lt;/strong&gt;, &lt;a href="https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h"&gt;vimos o que acontece quando executamos um &lt;code&gt;dotnet run&lt;/code&gt;&lt;/a&gt;, exploramos a &lt;a href="https://dev.to/bea_tavernaro/o-que-o-csproj-conta-sobre-o-seu-projeto-net-1j7l"&gt;estrutura de um projeto .NET&lt;/a&gt; e aprendemos a &lt;a href="https://dev.to/bea_tavernaro/um-dia-sem-visual-studio-usando-so-a-net-cli-a71"&gt;utilizar a CLI&lt;/a&gt; sem depender do Visual Studio.&lt;/p&gt;

&lt;p&gt;Mas tem uma coisa que aparece em praticamente qualquer projeto real e que costuma ir no automático: os pacotes NuGet.&lt;/p&gt;

&lt;p&gt;Quando precisamos de alguma funcionalidade, procuramos uma biblioteca que resolva nosso problema, instalamos o pacote e seguimos desenvolvendo. Eu mesma já fiz isso inúmeras vezes sem pensar muito no que estava acontecendo por trás daquela instalação, principalmente quando o pacote é conhecido e utilizado por milhares de outros desenvolvedores. Aliás, cuidado com isso.&lt;/p&gt;

&lt;p&gt;Só que instalar um pacote não significa necessariamente adicionar uma única biblioteca ao nosso projeto. Às vezes, estamos trazendo várias outras dependências junto com ele, e nem sempre sabemos quais são ou de onde vieram.&lt;/p&gt;

&lt;p&gt;Então, hoje vamos entender melhor como funciona o NuGet, de onde vêm essas dependências e como podemos verificar se os pacotes que utilizamos estão atualizados e seguros.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o NuGet?
&lt;/h2&gt;

&lt;p&gt;O NuGet é o gerenciador de pacotes do ecossistema .NET. Ele permite que desenvolvedores distribuam, compartilhem e reutilizem bibliotecas em diferentes projetos, facilitando o gerenciamento de dependências. Se você já trabalhou com JavaScript ou Python, pode pensar nele como o equivalente ao &lt;code&gt;npm&lt;/code&gt; ou ao &lt;code&gt;pip&lt;/code&gt;. Esses pacotes podem ser disponibilizados em diferentes fontes, sendo o &lt;a href="https://www.nuget.org/" rel="noopener noreferrer"&gt;NuGet.org&lt;/a&gt; o repositório público mais conhecido.&lt;/p&gt;

&lt;p&gt;Se abrirmos a &lt;a href="https://www.nuget.org/packages/Dapper" rel="noopener noreferrer"&gt;página do Dapper no NuGet.org&lt;/a&gt;, por exemplo, podemos encontrar informações sobre o pacote, suas versões disponíveis, os frameworks com os quais é compatível, suas dependências e os links para o repositório e a documentação. É interessante dar uma olhada nessas informações antes de instalar uma biblioteca, principalmente para verificar se ela atende às necessidades do nosso projeto e conhecer melhor o que estamos adicionando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmrghrujozy441yqbex0o.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmrghrujozy441yqbex0o.png" alt="Dapper page" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No &lt;a href="https://dev.to/bea_tavernaro/o-que-o-csproj-conta-sobre-o-seu-projeto-net-1j7l"&gt;Dia 02&lt;/a&gt;, vimos que podemos adicionar o Dapper ao nosso projeto utilizando o terminal. Depois da instalação, o pacote aparece no nosso &lt;code&gt;.csproj&lt;/code&gt; através de um &lt;code&gt;PackageReference&lt;/code&gt;, que informa ao .NET qual dependência estamos utilizando e qual versão foi declarada para o projeto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ownxbnmn1bhvl8fb6si.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ownxbnmn1bhvl8fb6si.png" alt="Dapper at csproj" width="571" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Até aqui parece bastante simples, mas tem uma parte importante desse processo que nem sempre fica visível quando olhamos apenas para o &lt;code&gt;.csproj&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependências que trazem outras dependências
&lt;/h2&gt;

&lt;p&gt;Quando instalamos um pacote NuGet, podemos estar adicionando muito mais do que aquela biblioteca que escolhemos. Um pacote também pode depender de outros pacotes para funcionar corretamente, e esses outros pacotes podem ter suas próprias dependências e assim por diante.&lt;/p&gt;

&lt;p&gt;É aqui que precisamos entender a diferença entre &lt;strong&gt;dependências diretas e transitivas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo4ywog0uhcrqfirkhd3w.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo4ywog0uhcrqfirkhd3w.png" alt="Dapper dependencies" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma dependência direta é aquela que adicionamos explicitamente ao nosso projeto, como fizemos com o Dapper. Já uma dependência transitiva é aquela que chega ao projeto porque outro pacote precisa dela para funcionar.&lt;/p&gt;

&lt;p&gt;Podemos visualizar essas dependências utilizando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet package list &lt;span class="nt"&gt;--include-transitive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpj2hvu42q5urgvg637rw.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpj2hvu42q5urgvg637rw.png" alt="Result" width="799" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O resultado apresenta os pacotes de nível superior (&lt;em&gt;top-level&lt;/em&gt;), que são as dependências diretas, e os pacotes transitivos utilizados pelo projeto. Dependendo das bibliotecas instaladas, essa lista pode ser enorme.&lt;/p&gt;

&lt;p&gt;E por que isso importa tanto?&lt;/p&gt;

&lt;p&gt;Porque, quando adicionamos uma dependência ao nosso projeto, também estamos confiando, em certa medida, nos pacotes dos quais ela depende. Isso não significa que dependências transitivas sejam ruins, afinal, elas fazem parte do funcionamento normal dos gerenciadores de pacotes, mas precisamos entender que elas também fazem parte da nossa aplicação.&lt;/p&gt;

&lt;p&gt;Um exemplo de como isso pode se tornar um problema aconteceu em março de 2026, envolvendo o pacote Axios, bastante utilizado para realizar requisições HTTP em aplicações JavaScript.&lt;/p&gt;

&lt;p&gt;Nesse caso, um invasor conseguiu publicar versões comprometidas do Axios no npm. Essas versões incluíam uma nova dependência chamada &lt;code&gt;plain-crypto-js&lt;/code&gt;, que continha código malicioso. Assim, quem instalasse uma das versões afetadas poderia acabar trazendo e executando esse código sem ter escolhido instalar diretamente o pacote malicioso.&lt;/p&gt;

&lt;p&gt;O caso foi documentado pelo &lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package" rel="noopener noreferrer"&gt;Google Threat Intelligence Group&lt;/a&gt; e é um exemplo de ataque à cadeia de suprimentos de software, também conhecido como &lt;em&gt;supply chain attack&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Apesar de ter acontecido no ecossistema npm, o exemplo ajuda a entender um risco que também existe no NuGet e em outros gerenciadores de pacotes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Não basta conhecer apenas a biblioteca que instalamos, precisamos considerar também as dependências que vêm junto com ela.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet restore&lt;/code&gt; — de onde vêm os pacotes?
&lt;/h2&gt;

&lt;p&gt;Sabendo agora que um pacote pode depender de vários outros, surge outra questão: como o .NET encontra todas essas dependências e consegue fazer nosso projeto funcionar? Podemos utilizar o comando &lt;code&gt;dotnet restore&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;dotnet restore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando executamos esse comando, o .NET analisa as dependências declaradas no projeto, resolve quais versões precisam ser utilizadas e verifica as fontes de pacotes configuradas para encontrar o que for necessário.&lt;/p&gt;

&lt;p&gt;O NuGet também utiliza um &lt;strong&gt;cache global de pacotes&lt;/strong&gt;, que normalmente fica armazenado na pasta &lt;code&gt;.nuget/packages&lt;/code&gt; do diretório do usuário. Isso significa que, se uma versão de um pacote já foi baixada anteriormente, ela pode ser reutilizada por outros projetos sem precisar ser baixada novamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wjqtgqftwf9lm11dxtf.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wjqtgqftwf9lm11dxtf.gif" alt="Smart" width="480" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;É por isso que não precisamos enviar todas as bibliotecas utilizadas pela aplicação para o Git. Quando outra pessoa clona nosso repositório, o .NET consegue ler as dependências declaradas e restaurar os pacotes necessários, desde que tenha acesso às fontes onde eles estão disponíveis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Como saber se nossas dependências estão atualizadas e seguras?
&lt;/h2&gt;

&lt;p&gt;Instalar uma biblioteca e nunca mais olhar para ela pode parecer inofensivo, principalmente quando tudo continua funcionando, mas os pacotes que utilizamos também recebem atualizações, correções de bugs e correções de vulnerabilidades de segurança.&lt;/p&gt;

&lt;p&gt;Através da .NET CLI, conseguimos identificar os pacotes que precisam dessas atualizações sem precisar acessar a página NuGet de cada um. O comando &lt;code&gt;dotnet package list --outdated&lt;/code&gt; mostra quais pacotes possuem versões mais recentes disponíveis:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feysb0im5sscqa6zi7tjj.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feysb0im5sscqa6zi7tjj.png" alt="Result" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse comando compara os pacotes utilizados pelo projeto com as versões disponíveis nas fontes configuradas e apresenta aqueles que podem ser atualizados.&lt;/p&gt;

&lt;p&gt;Mas existe uma diferença importante entre um pacote estar desatualizado e um pacote estar vulnerável.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nem toda versão antiga apresenta um problema de segurança e nem toda atualização precisa ser aplicada imediatamente, já que algumas podem introduzir mudanças incompatíveis com o nosso código.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet package list &lt;span class="nt"&gt;--vulnerable&lt;/span&gt; &lt;span class="nt"&gt;--include-transitive&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando acima consulta informações de vulnerabilidades disponíveis nas fontes de auditoria e apresenta os pacotes afetados, permitindo que identifiquemos problemas que precisam de atenção.&lt;/p&gt;

&lt;p&gt;E aqui vale lembrar do caso do Axios que vimos anteriormente. Essas verificações são importantes, mas não significam que estamos completamente protegidos contra qualquer pacote malicioso. Elas dependem de vulnerabilidades que já foram identificadas e registradas, &lt;strong&gt;&lt;em&gt;então um pacote recém-comprometido pode ainda não aparecer em nenhuma dessas consultas.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Por isso, manter nossas dependências seguras não significa simplesmente atualizar tudo para a versão mais recente ou executar um comando de vez em quando. &lt;br&gt;
Precisamos avaliar quais bibliotecas estamos utilizando, acompanhar atualizações importantes e entender o impacto que essas dependências podem ter na aplicação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;Na correria do desenvolvimento, é muito fácil instalar um pacote para resolver algum problema e nunca mais pensar nele. Se a biblioteca funciona, o projeto compila e a funcionalidade está pronta, normalmente seguimos para a próxima task sem olhar muito para o que foi adicionado.&lt;/p&gt;

&lt;p&gt;Mas hoje vimos que existe bastante coisa acontecendo por trás de uma simples instalação. O NuGet precisa resolver dependências, encontrar os pacotes necessários, restaurar seus arquivos e garantir que tudo esteja disponível para o processo de build. E, como já diria o Tio Ben: "Com grandes poderes vêm grandes responsabilidades". Essa facilidade de contar com código pronto vem com a responsabilidade de acompanhar as bibliotecas que utilizamos.&lt;/p&gt;

&lt;p&gt;Não precisamos desconfiar de cada pacote que instalamos, mas entender de onde vêm nossas dependências e como podemos verificar sua situação já é um passo importante para manter nossos projetos mais seguros e fáceis de manter.&lt;/p&gt;

&lt;p&gt;Ah, vale a pena dar uma olhada na &lt;a href="https://www.nuget.org/stats" rel="noopener noreferrer"&gt;página de estatísticas do NuGet&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Até amanhã!&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/" rel="noopener noreferrer"&gt;NuGet documentation — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders" rel="noopener noreferrer"&gt;Managing the global packages and cache folders — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/concepts/auditing-packages" rel="noopener noreferrer"&gt;Auditing NuGet packages — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/topics/threat-intelligence/north-korea-threat-actor-targets-axios-npm-package" rel="noopener noreferrer"&gt;North Korea-Nexus Threat Actor Compromises Widely Used Axios NPM Package — Google Cloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>learning</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>A Day Without Visual Studio, Using Only the .NET CLI</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Thu, 15 Oct 2026 13:02:03 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/a-day-without-visual-studio-using-only-the-net-cli-3cg0</link>
      <guid>https://dev.to/bea_tavernaro/a-day-without-visual-studio-using-only-the-net-cli-3cg0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇧🇷 Prefer reading in Portuguese? &lt;a href="https://dev.to/bea_tavernaro/um-dia-sem-visual-studio-usando-so-a-net-cli-a71"&gt;Read the Brazilian Portuguese version.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today, Visual Studio is staying closed.&lt;/p&gt;

&lt;p&gt;On &lt;a href="https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi"&gt;Day 01&lt;/a&gt; of my 30 Days of .NET challenge, we explored what happens behind a &lt;code&gt;dotnet run&lt;/code&gt; and got to know the .NET CLI. On &lt;a href="https://dev.to/bea_tavernaro/what-does-the-csproj-file-tell-you-about-your-net-project-5dhd"&gt;Day 02&lt;/a&gt;, we opened up a .NET project to better understand &lt;code&gt;Program.cs&lt;/code&gt;, &lt;code&gt;.csproj&lt;/code&gt;, &lt;code&gt;bin&lt;/code&gt;, &lt;code&gt;obj&lt;/code&gt;, and some of the configurations that make our project work.&lt;/p&gt;

&lt;p&gt;So today I decided to put those two things together and take on a little challenge that reminded me of the days before AI: create, build, run, test, and publish a .NET application using only the terminal.&lt;/p&gt;

&lt;p&gt;No play button, no right-clicking the Solution, no Build menu, and no Visual Studio doing things for me.&lt;/p&gt;

&lt;p&gt;Just me, the terminal, and the .NET CLI. Just like Neo from The Matrix.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhfga2mcantrqd4u4fjoy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhfga2mcantrqd4u4fjoy.gif" alt="The Matrix has you gif" width="500" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Before we start, what can we create?
&lt;/h2&gt;

&lt;p&gt;On &lt;a href="https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi"&gt;Day 01&lt;/a&gt;, we learned that the .NET CLI (Command-Line Interface) is a tool that allows us to interact with .NET through written commands and that it comes with the .NET SDK.&lt;/p&gt;

&lt;p&gt;One of the first commands we encountered was &lt;code&gt;dotnet new&lt;/code&gt;. But before creating anything, we can find out which templates are available on our machine using the &lt;code&gt;dotnet new list&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2oe30r3imdsjjfitimq.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2oe30r3imdsjjfitimq.png" alt="Output of the dotnet new list command" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result shows a HUGE list of templates we can use to create different types of .NET projects and files. Among them, we can find Console applications, Class Libraries, test projects, web applications, and many others. We'll explore the differences between them in the not-too-distant future.&lt;/p&gt;

&lt;p&gt;So when we type &lt;code&gt;dotnet new console&lt;/code&gt;, &lt;code&gt;console&lt;/code&gt; isn't just some random word the CLI understands. It's the short name of a template that's installed and available to &lt;code&gt;dotnet new&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq1qwtr01luf1w2xgiahw.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq1qwtr01luf1w2xgiahw.png" alt="console" width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For our challenge, we're going to create a Console application called &lt;code&gt;Dia03&lt;/code&gt; using the familiar command &lt;code&gt;dotnet new console -n Dia03&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;-n&lt;/code&gt; option is short for &lt;code&gt;--name&lt;/code&gt; and defines the name of what we're creating. After running the command, we can navigate into the folder. And that's it, our project was created without opening an IDE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0rfitt82utoj0r33tgk7.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0rfitt82utoj0r33tgk7.png" alt="ls command output" width="605" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet build&lt;/code&gt; — let's see if this compiles
&lt;/h2&gt;

&lt;p&gt;Now we have code, but we need to transform it into something .NET can execute. That's where our &lt;code&gt;dotnet build&lt;/code&gt; from Day 01 comes in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When we execute this command, .NET uses MSBuild to build the project and its dependencies. The C# code goes through the compilation process we saw on Day 01, and the resulting files start appearing in that &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt; structure we explored on Day 02.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By default, the build uses the &lt;code&gt;Debug&lt;/code&gt; configuration, so we can find our files in a structure similar to this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79lvsapqicrg2d2wsuyf.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79lvsapqicrg2d2wsuyf.png" alt="Folder structure" width="363" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But we can also choose another configuration by using Release: &lt;code&gt;dotnet build -c Release&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;-c&lt;/code&gt; option is short for &lt;code&gt;--configuration&lt;/code&gt;, and in this case, we're requesting a build using the &lt;code&gt;Release&lt;/code&gt; configuration.&lt;/p&gt;

&lt;p&gt;In simple terms, Debug is the configuration designed for application development and debugging, while Release is the configuration used when we want a build optimized for distribution. Look how it adds folders to &lt;code&gt;obj&lt;/code&gt; and &lt;code&gt;bin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fess1mg7b7kea8tu8qxp2.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fess1mg7b7kea8tu8qxp2.png" alt="I said I wasn't going to!" width="587" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;dotnet build&lt;/code&gt; isn't running our application. It's building our project and checking whether the code can be successfully compiled. If there's a lovely compilation error somewhere along the way, it'll let us know.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet run&lt;/code&gt; — we already know this one
&lt;/h2&gt;

&lt;p&gt;After three days of talking about .NET, &lt;code&gt;dotnet run&lt;/code&gt; is practically becoming part of the family and joining us for Sunday lunch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ccq1b3e33pxwh2m0uly.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ccq1b3e33pxwh2m0uly.png" alt="dotnet run output" width="432" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command runs our application and, when necessary, performs the build process beforehand. If you want to know more about this build process, you can also read &lt;a href="https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi"&gt;Day 01&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet test&lt;/code&gt; — now let's make QA happy
&lt;/h2&gt;

&lt;p&gt;We have an application that we can create, build, and run, but we're still missing something important: &lt;del&gt;90% test coverage&lt;/del&gt; tests.&lt;/p&gt;

&lt;p&gt;If we try to explore &lt;code&gt;dotnet test&lt;/code&gt; in our Console project, we don't have any tests to execute. So let's use the CLI itself to create a test project.&lt;/p&gt;

&lt;p&gt;Going back to the folder where our &lt;code&gt;Dia03&lt;/code&gt; project is located, we can execute &lt;code&gt;dotnet new xunit -n Dia03.Tests&lt;/code&gt; to create this project. I won't go into the details of this command today.&lt;/p&gt;

&lt;p&gt;Now we have two projects:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoahldegvalhwodscmr5.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoahldegvalhwodscmr5.png" alt="Terminal showing both projects" width="685" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;xunit&lt;/code&gt; template creates a test project using xUnit, a testing framework for .NET. It provides the tools and conventions we use to write automated tests in C#, especially unit tests.&lt;/p&gt;

&lt;p&gt;Since we want our tests to be able to access the project we're testing, we add a reference between them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet reference add ../Dia03/Dia03.csproj &lt;span class="nt"&gt;--project&lt;/span&gt; Dia03.Tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reference is registered in the test project's &lt;code&gt;.csproj&lt;/code&gt; through a &lt;code&gt;ProjectReference&lt;/code&gt;, very similar to what we saw yesterday when we added a NuGet package.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fioyvxf8s3scxmttdkkgf.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fioyvxf8s3scxmttdkkgf.png" alt="I said I wasn't going to open the IDE" width="508" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can run our tests and see the result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqsi7bxk9i5ym2wyhr38g.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqsi7bxk9i5ym2wyhr38g.png" alt="Success" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The command builds the necessary projects and executes the tests found in the test project. At the end, we get the results directly in the terminal, showing how many tests passed, failed, or were skipped.&lt;/p&gt;

&lt;p&gt;I'm not going to dive into xUnit and test structure right now because that deserves its own day. What's important here is that we managed to create the test project and run it without opening Visual Studio's Test Explorer.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet publish&lt;/code&gt; — we're done, now we need to deliver
&lt;/h2&gt;

&lt;p&gt;So far, we've created our project, built it, run it, and executed the tests. Now we need to prepare our application to leave our machine using &lt;code&gt;dotnet publish&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One question I've had before is: if &lt;code&gt;dotnet build&lt;/code&gt; already compiled my application, why does &lt;code&gt;dotnet publish&lt;/code&gt; exist? Both commands do go through the build process, but they serve different purposes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dotnet build&lt;/code&gt; focuses on building the project, generating the binaries needed for development and code validation. On the other hand, &lt;code&gt;dotnet publish&lt;/code&gt; prepares the application and its dependencies so it can be deployed to another environment.&lt;/p&gt;

&lt;p&gt;We can publish our application in Release using the command &lt;code&gt;dotnet publish -c Release&lt;/code&gt; and see a folder similar to this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzpji42cmf59bzvpfsezz.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzpji42cmf59bzvpfsezz.png" alt="Publish!" width="604" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;publish&lt;/code&gt; folder contains the files that are part of our application's published output. So a simple way to think about it is that &lt;code&gt;build&lt;/code&gt; answers something like "Can I build this project?", while &lt;code&gt;publish&lt;/code&gt; answers "Which files do I need to prepare to distribute this application?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounds like a lot &lt;del&gt;and it is&lt;/del&gt;, but the CLI itself can help us when we're desperate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't memorize everything, ask the CLI itself
&lt;/h2&gt;

&lt;p&gt;So far, we've used several command options that look like random letters: &lt;code&gt;-n&lt;/code&gt;, &lt;code&gt;-c&lt;/code&gt;. And the list gets much longer as we start exploring the CLI. Eventually, we end up typing things without even knowing why. That's not what we're aiming for anymore, right? The good news is that we don't need to memorize all these commands and options.&lt;/p&gt;

&lt;p&gt;We can ask for help directly in the terminal using &lt;code&gt;dotnet --help&lt;/code&gt; or, even better, ask for help with a specific command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet build &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet run &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet publish &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fikl9mfsavran1n47j3mx.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fikl9mfsavran1n47j3mx.png" alt="Heeeelp!" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This shows the command's description, its arguments, and the available options. For me, knowing that an option exists and knowing where to find it is much more useful than trying to memorize fifty parameters I might use twice a year.&lt;/p&gt;

&lt;h2&gt;
  
  
  From zero to publish without Visual Studio
&lt;/h2&gt;

&lt;p&gt;We started the day without opening Visual Studio and went through practically the entire basic lifecycle of our application using only the .NET CLI. That doesn't mean I'm going to uninstall Visual Studio tomorrow and start developing everything through CMD (God forbid). The IDE exists precisely to make our lives easier and automate many of these tasks. Thank you, Microsoft.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But there's a huge difference between letting a tool do something for us and not knowing what it's doing for us. We could spend hours philosophizing about this and the use of AI, but let's save that conversation for a coffee.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When we click Build, run tests through Test Explorer, or publish an application using the Visual Studio interface, there are .NET tools and commands working behind all those conveniences. Knowing the CLI helps us better understand this process and also makes a big difference when we leave our own machines and encounter environments where there isn't a pretty button to click, such as CI/CD pipelines, containers, and servers.&lt;/p&gt;

&lt;p&gt;Visual Studio got some rest today, but it can open again tomorrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/dotnet/core/tools/" rel="noopener noreferrer"&gt;.NET CLI overview — Microsoft Learn&lt;/a&gt; and its command-specific subpages&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What does the .csproj file tell you about your .NET project?</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Thu, 15 Oct 2026 12:54:43 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/what-does-the-csproj-file-tell-you-about-your-net-project-5dhd</link>
      <guid>https://dev.to/bea_tavernaro/what-does-the-csproj-file-tell-you-about-your-net-project-5dhd</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇧🇷 Prefer reading in Portuguese? &lt;a href="https://dev.to/bea_tavernaro/o-que-o-csproj-conta-sobre-o-seu-projeto-net-1j7l"&gt;Read the Brazilian Portuguese version.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi"&gt;On the first day of 30 Days of .NET&lt;/a&gt;, I explored what happens behind a simple &lt;code&gt;dotnet run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But before &lt;code&gt;dotnet run&lt;/code&gt;, there's the project itself.&lt;/p&gt;

&lt;p&gt;When we create a .NET application, even the simplest one possible, some files and folders automatically appear. &lt;code&gt;Program.cs&lt;/code&gt;, &lt;code&gt;.csproj&lt;/code&gt;, &lt;code&gt;obj&lt;/code&gt;, then &lt;code&gt;bin&lt;/code&gt;, and we just keep coding without worrying about understanding them.&lt;/p&gt;

&lt;p&gt;I've opened a &lt;code&gt;.csproj&lt;/code&gt; file several times myself to install a package, change a configuration, or check the .NET version, and then closed it without really understanding what I had done.&lt;/p&gt;

&lt;p&gt;So today I decided to open up this little box and understand what each of these things is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the simplest project possible
&lt;/h2&gt;

&lt;p&gt;Let's start by creating a Console application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flh9ioalg99y6fymeiy7w.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flh9ioalg99y6fymeiy7w.png" alt="Terminal command output" width="532" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;dotnet new&lt;/code&gt; command creates projects and other files from templates. In this case, we're using the &lt;code&gt;console&lt;/code&gt; template and naming the project &lt;code&gt;Dia02&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Inside the folder, we have a structure similar to this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7u4z6j656kpmjw5aj5t.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7u4z6j656kpmjw5aj5t.png" alt="Terminal command output" width="621" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not much to get started, but we already have quite a few things to understand here.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;Program.cs&lt;/code&gt; — where it all begins
&lt;/h2&gt;

&lt;p&gt;Opening the &lt;code&gt;Program.cs&lt;/code&gt; file of a modern Console application, we find something like this:&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="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;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Program.cs&lt;/code&gt; file is where we find the application's entry point. It's where our program starts executing and, in larger applications, it's usually where we configure and initialize the necessary components before the application actually starts doing its work.&lt;/p&gt;

&lt;p&gt;If you've seen older C# projects, you might be missing a few things in &lt;code&gt;Program.cs&lt;/code&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="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="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;"Hello, World!"&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;Since C# 9, we've had top-level statements, which allow us to write the application's entry point code without explicitly declaring a &lt;code&gt;Program&lt;/code&gt; class and a &lt;code&gt;Main&lt;/code&gt; method, as in the second example. The compiler generates the necessary entry point for us, making &lt;code&gt;Program.cs&lt;/code&gt; much less verbose and cleaner.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;.csproj&lt;/code&gt; — the file that describes our project
&lt;/h2&gt;

&lt;p&gt;Now we've reached the most important file in this article.&lt;/p&gt;

&lt;p&gt;If we open &lt;code&gt;Dia02.csproj&lt;/code&gt;, we'll find something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficaejf7td4uvkeud2kl2.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficaejf7td4uvkeud2kl2.png" alt="csproj file" width="575" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;.csproj&lt;/code&gt; file contains various pieces of information that tell the build system how the project should be handled: which SDK to use, which framework it targets, package references, references to other projects, and several compilation settings. Oh, and it's an XML file.&lt;/p&gt;

&lt;p&gt;Looking at our example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Project Sdk="Microsoft.NET.Sdk"&amp;gt;&lt;/code&gt; : defines the &lt;strong&gt;Project SDK&lt;/strong&gt; used by the project. In this case, we're using the base .NET SDK. In an ASP.NET Core application, for example, it's common to find &lt;code&gt;Microsoft.NET.Sdk.Web&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/code&gt; : groups project properties and settings. It doesn't define a specific configuration on its own, but works as a "group" for the properties inside it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;OutputType&amp;gt;Exe&amp;lt;/OutputType&amp;gt;&lt;/code&gt; : defines the type of output generated by the project. &lt;code&gt;Exe&lt;/code&gt; indicates that we're building an executable application.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;TargetFramework&amp;gt;net10.0&amp;lt;/TargetFramework&amp;gt;&lt;/code&gt; : defines which Target Framework the project will be built for. In this example, our target is .NET 10. This doesn't mean "which SDK I have installed", but rather which framework the application targets.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;/code&gt; : makes the SDK automatically add some common &lt;code&gt;using&lt;/code&gt; directives to the project. That's why we can use things like &lt;code&gt;Console.WriteLine()&lt;/code&gt; without necessarily writing &lt;code&gt;using System;&lt;/code&gt; at the beginning of the file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;/code&gt; : enables the &lt;strong&gt;Nullable Reference Types&lt;/strong&gt; context, allowing the compiler to warn us about situations where a reference might be &lt;code&gt;null&lt;/code&gt;. For example, it starts distinguishing between &lt;code&gt;string name&lt;/code&gt; and &lt;code&gt;string? name&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  And what happens when we install a NuGet package?
&lt;/h2&gt;

&lt;p&gt;Now let's make a few changes to our project.&lt;/p&gt;

&lt;p&gt;We can add a package using the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet package add Dapper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, if we open our &lt;code&gt;.csproj&lt;/code&gt; again, something new has appeared:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4yext9zjhx40bere1bui.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4yext9zjhx40bere1bui.png" alt="Dapper added to the project" width="696" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's understand what's new:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;ItemGroup&amp;gt;&lt;/code&gt; : while &lt;code&gt;PropertyGroup&lt;/code&gt; groups &lt;strong&gt;properties and settings&lt;/strong&gt;, &lt;code&gt;ItemGroup&lt;/code&gt; groups items that are part of or used by the project, such as packages, references to other projects, and files.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;PackageReference Include="Dapper" Version="..." /&amp;gt;&lt;/code&gt; : declares a dependency on a NuGet package. &lt;code&gt;Include="Dapper"&lt;/code&gt; specifies which package we want to use, and &lt;code&gt;Version="..."&lt;/code&gt; specifies &lt;strong&gt;which version&lt;/strong&gt; of that package the project uses.&lt;/p&gt;

&lt;p&gt;When we install a NuGet package, the dependency is registered in the &lt;code&gt;.csproj&lt;/code&gt; file itself, along with the version used by the project. That's also why we don't need to commit the packages themselves to Git. When someone else clones the project, .NET can read the &lt;code&gt;PackageReference&lt;/code&gt; entries and restore the necessary dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  And where did &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt; come from?
&lt;/h2&gt;

&lt;p&gt;When we execute &lt;code&gt;dotnet build&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00idvl5fxq7fc05kdagc.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00idvl5fxq7fc05kdagc.png" alt="dotnet build output" width="566" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.NET starts the build process for our project, and during this process, two folders that probably every .NET developer has encountered are created or updated: &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqntmcxa8o4nx2u01ql2w.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqntmcxa8o4nx2u01ql2w.png" alt="bin and obj" width="600" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although both are related to the build process, they serve different purposes.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;bin&lt;/code&gt; folder contains the main files resulting from our application's compilation. Inside it, .NET organizes these files according to the build configuration and the project's Target Framework.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;obj&lt;/code&gt; folder, on the other hand, works as a workspace for the build process. While the output we're interested in goes to &lt;code&gt;bin&lt;/code&gt;, during compilation, .NET and MSBuild need to generate and store several intermediate files. That's where &lt;code&gt;obj&lt;/code&gt; comes in.&lt;/p&gt;

&lt;p&gt;Normally, neither folder is versioned in Git. If we delete &lt;code&gt;bin&lt;/code&gt; and &lt;code&gt;obj&lt;/code&gt; and run &lt;code&gt;dotnet build&lt;/code&gt; again, .NET regenerates whatever is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;With tight deadlines, it's very easy to simply create a project, install packages, run &lt;code&gt;dotnet build&lt;/code&gt;, and move on without thinking too much about what's happening behind the scenes. And most of the time, it really will work. But understanding how the project is structured and where .NET gets the information it needs to build our application makes a big difference when something stops working as expected &lt;del&gt;which is almost all the time&lt;/del&gt;. The more we understand the tools we use every day, the easier it becomes to investigate errors and, consequently, the easier and faster it becomes to complete a task.&lt;/p&gt;

&lt;p&gt;See you tomorrow!&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/project-sdk/overview" rel="noopener noreferrer"&gt;.NET Project SDK overview — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props" rel="noopener noreferrer"&gt;MSBuild properties for Microsoft.NET.Sdk — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/dotnet/standard/frameworks" rel="noopener noreferrer"&gt;Target frameworks in SDK-style projects — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/dotnet/csharp/fundamentals/program-structure/top-level-statements" rel="noopener noreferrer"&gt;Top-level statements — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files" rel="noopener noreferrer"&gt;Package references in project files — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items" rel="noopener noreferrer"&gt;Common MSBuild project items — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>softwaredevelopment</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What Really Happens When You Run `dotnet run`?</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Thu, 15 Oct 2026 12:44:41 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi</link>
      <guid>https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇧🇷 &lt;strong&gt;Prefer reading in Portuguese?&lt;/strong&gt; &lt;a href="https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h"&gt;Read the Brazilian Portuguese version&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you work with .NET, you've probably typed this command countless times:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;And a few seconds later, your application is running. Simple as that.&lt;/p&gt;

&lt;p&gt;But what actually happened between pressing Enter and your application starting to run?&lt;/p&gt;

&lt;p&gt;Who found the project? Who compiled the C# code? What gets generated during compilation? Can the processor execute C# directly? And where do the SDK, Runtime, and CLR fit into all of this?&lt;/p&gt;

&lt;p&gt;Trying to answer these questions is exactly why I chose this topic for the first day of my &lt;strong&gt;30 Days of .NET&lt;/strong&gt; challenge.&lt;/p&gt;

&lt;p&gt;So let's follow the journey of a &lt;code&gt;dotnet run&lt;/code&gt;, from the terminal all the way to application execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  You type &lt;code&gt;dotnet run&lt;/code&gt; in the terminal
&lt;/h2&gt;

&lt;p&gt;The first piece we encounter is the &lt;strong&gt;.NET CLI (Command-Line Interface)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But what exactly is a CLI?&lt;/p&gt;

&lt;p&gt;A CLI is an interface that allows us to interact with a program through written commands. So no, the CLI isn't exactly that "black screen" we call the terminal. The terminal is the program we use to type commands, while the .NET CLI is the tool that receives and interprets commands like &lt;code&gt;dotnet run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On Windows, for example, we can use the .NET CLI through PowerShell, Command Prompt, or Windows Terminal. On Linux and macOS, we can use it through their respective terminals.&lt;/p&gt;

&lt;p&gt;When we install the .NET SDK, we get access to the &lt;code&gt;dotnet&lt;/code&gt; command, which serves as the entry point for several tools in the platform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new       &lt;span class="c"&gt;# creates a new project from a template&lt;/span&gt;
dotnet restore   &lt;span class="c"&gt;# restores project dependencies&lt;/span&gt;
dotnet build     &lt;span class="c"&gt;# builds the project&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt;      &lt;span class="c"&gt;# runs tests&lt;/span&gt;
dotnet run       &lt;span class="c"&gt;# builds and runs the application&lt;/span&gt;
dotnet publish   &lt;span class="c"&gt;# prepares the application for distribution&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we execute &lt;code&gt;dotnet run&lt;/code&gt;, we're basically saying: find my project, prepare it for execution, and run it.&lt;/p&gt;

&lt;p&gt;But the CLI didn't magically appear on our machine. It came along with another important piece: the &lt;strong&gt;.NET SDK&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The SDK - Software Development Kit
&lt;/h2&gt;

&lt;p&gt;The SDK brings together the tools we developers need to build our .NET applications. Think of it as a toolbox with a hammer and a screwdriver, except the SDK comes with the CLI, build tools, compilers, libraries, and other components needed to build our applications.&lt;/p&gt;

&lt;p&gt;Because of all these tools, when we're developing an application, we need to make sure the SDK is installed. We can check which SDKs are installed using:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35zkylnmlohvtn4ugiew.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35zkylnmlohvtn4ugiew.png" alt="Terminal showing the output of the dotnet --list-sdks command" width="334" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, when we execute &lt;code&gt;dotnet run&lt;/code&gt;, we're using the tools provided by the SDK to prepare our application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our C# code needs to be compiled, right?
&lt;/h2&gt;

&lt;p&gt;Our processor has absolutely no idea what to do with a random line like this:&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="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;"Help, I don't understand"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After writing our C# code and before executing it, it needs to go through a compilation process.&lt;/p&gt;

&lt;p&gt;In simple terms, compiling means transforming the code we write into a representation that can move on to the next stages of execution. In C#, the compiler transforms our code into &lt;strong&gt;IL (Intermediate Language)&lt;/strong&gt; and includes metadata about our code.&lt;/p&gt;

&lt;p&gt;IL is an intermediate language. In other words, at this point, we're still not speaking the "machine language" that the processor can execute.&lt;/p&gt;

&lt;p&gt;This is where we start moving away from the SDK's territory and into the actual execution process of our application.&lt;/p&gt;

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

&lt;p&gt;The &lt;strong&gt;.NET Runtime&lt;/strong&gt; is the set of components required to execute a .NET application after it has been compiled.&lt;/p&gt;

&lt;p&gt;It includes components such as the &lt;strong&gt;CLR&lt;/strong&gt;, fundamental .NET libraries, and other files needed to run an application.&lt;/p&gt;

&lt;p&gt;That's why the SDK and Runtime have different purposes. If we're developing an application, we need the tools provided by the SDK. But if we only want to run an application, depending on how it was published, we might only need the Runtime.&lt;/p&gt;

&lt;p&gt;We can check which runtimes are installed on our machine using:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2o4s1am6d3zj5lfnhbon.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2o4s1am6d3zj5lfnhbon.png" alt="Terminal showing the output of the dotnet --list-runtimes command" width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When our application starts executing, the Runtime provides the environment needed for the IL we generated earlier to finally run.&lt;/p&gt;

&lt;p&gt;And one of the most important pieces of this process is the CLR.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLR - Common Language Runtime
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;CLR (Common Language Runtime)&lt;/strong&gt; is the environment responsible for executing managed .NET code.&lt;/p&gt;

&lt;p&gt;But it doesn't just "run the code". During execution, the CLR takes care of several other things for us. When we create objects in our code, for example, we need memory to store them. The CLR participates in memory management, and the Garbage Collector identifies objects that are no longer being used so their memory can be reclaimed.&lt;/p&gt;

&lt;p&gt;It also provides other services that we constantly use without having to implement everything manually, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memory management;&lt;/li&gt;
&lt;li&gt;exception handling;&lt;/li&gt;
&lt;li&gt;thread management;&lt;/li&gt;
&lt;li&gt;type safety.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;During traditional execution, another important component comes into play: the &lt;strong&gt;JIT — Just-In-Time compiler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It transforms IL (the Intermediate Language we talked about earlier) into machine code that the processor can actually execute.&lt;/p&gt;

&lt;p&gt;And here's something really important about .NET: it's cross-platform!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv5467pisk0slqd6pz4va.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv5467pisk0slqd6pz4va.png" alt="Description of .NET on Microsoft's website" width="800" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The IL generated during compilation is an intermediate representation and isn't directly tied to the instructions of a specific CPU. When the application runs, the Runtime for that platform handles execution, and the JIT generates machine code appropriate for the processor's architecture.&lt;/p&gt;

&lt;p&gt;The same .NET code can run on Windows, Linux, and macOS, as long as .NET supports that operating system and architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting it all together
&lt;/h2&gt;

&lt;p&gt;Now we can see the entire journey:&lt;/p&gt;

&lt;p&gt;All of this started with a single two-word command, probably one of the most frequently used:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  So what's the difference between SDK, CLI, Runtime, and CLR?
&lt;/h2&gt;

&lt;p&gt;After following the command's journey, these definitions become much less abstract. Here's a quick summary to keep in your memory (yours, not your computer's).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;In a tweet&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A set of tools we use to develop .NET applications.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A command-line interface that gives us access to various .NET tools.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A set of components required to execute a .NET application.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The execution environment for managed code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The intermediate language generated when C# code is compiled.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JIT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A compiler that transforms IL into machine code.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So instead of memorizing four separate definitions, we can think of them as pieces that come into play at different stages of our application's lifecycle.&lt;/p&gt;

&lt;p&gt;And the next time I type &lt;code&gt;dotnet run&lt;/code&gt;, I'll know just how much is happening behind that simple command.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/sdk" rel="noopener noreferrer"&gt;.NET SDK overview — Microsoft Learn&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;.NET CLI overview — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet" rel="noopener noreferrer"&gt;dotnet command — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/clr" rel="noopener noreferrer"&gt;Common Language Runtime (CLR) — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/managed-execution-process" rel="noopener noreferrer"&gt;Managed execution process — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/" rel="noopener noreferrer"&gt;Garbage Collection — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals" rel="noopener noreferrer"&gt;Fundamentals of Garbage Collection — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/project-sdk/overview" rel="noopener noreferrer"&gt;.NET Project SDK overview — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Um dia sem Visual Studio usando só a .NET CLI</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Sat, 03 Oct 2026 21:02:46 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/um-dia-sem-visual-studio-usando-so-a-net-cli-a71</link>
      <guid>https://dev.to/bea_tavernaro/um-dia-sem-visual-studio-usando-so-a-net-cli-a71</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇺🇸 Prefer reading in English? &lt;a href="https://dev.to/bea_tavernaro/a-day-without-visual-studio-using-only-the-net-cli-3cg0"&gt;Read the English version here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hoje o Visual Studio não vai abrir.&lt;/p&gt;

&lt;p&gt;No &lt;a href="https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h"&gt;Dia 01&lt;/a&gt; dos meus 30 dias de .NET nós vimos o que acontece por trás de um &lt;code&gt;dotnet run&lt;/code&gt; e conhecemos a .NET CLI. No &lt;a href="https://dev.to/bea_tavernaro/o-que-o-csproj-conta-sobre-o-seu-projeto-net-1j7l"&gt;Dia 02&lt;/a&gt; abrimos a caixinha de um projeto .NET para entender melhor o &lt;code&gt;Program.cs&lt;/code&gt;, &lt;code&gt;.csproj&lt;/code&gt;, &lt;code&gt;bin&lt;/code&gt;, &lt;code&gt;obj&lt;/code&gt; e algumas das configurações que fazem nosso projeto funcionar.&lt;/p&gt;

&lt;p&gt;Então hoje resolvi juntar as duas coisas e fazer um pequeno desafio que me lembrou dos tempos sem IA: criar, compilar, executar, testar e publicar uma aplicação .NET usando somente o terminal.&lt;/p&gt;

&lt;p&gt;Sem botão de play, sem clicar com o botão direito na Solution, sem menu de Build e sem Visual Studio fazendo as coisas por mim.&lt;/p&gt;

&lt;p&gt;Só eu, o terminal e a .NET CLI. Tal qual NEO do Matrix.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhfga2mcantrqd4u4fjoy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhfga2mcantrqd4u4fjoy.gif" alt="The Matrix has you gif" width="500" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de começar, o que podemos criar?
&lt;/h2&gt;

&lt;p&gt;No &lt;a href="https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h"&gt;Dia 01&lt;/a&gt; vimos que a .NET CLI (Command-Line Interface) é uma ferramenta que permite interagir com o .NET através de comandos escritos e que ela vem junto com o .NET SDK.&lt;/p&gt;

&lt;p&gt;Um dos primeiros comandos que encontramos foi &lt;code&gt;dotnet new&lt;/code&gt;. Mas, antes de criar qualquer coisa, podemos descobrir quais templates estão disponíveis na nossa máquina usando o comando &lt;code&gt;dotnet new list&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2oe30r3imdsjjfitimq.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft2oe30r3imdsjjfitimq.png" alt="Resultado do comando dotnet new list" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O resultado mostra uma lista ENORME de templates que podemos utilizar para criar diferentes tipos de projetos e arquivos .NET. Entre eles encontramos aplicações Console, Class Libraries, projetos de testes, aplicações web e vários outros. A diferença entre cada um vêm num futuro não muito distante.&lt;/p&gt;

&lt;p&gt;Então quando escrevemos &lt;code&gt;dotnet new console&lt;/code&gt; o &lt;code&gt;console&lt;/code&gt; não é só uma palavra aleatória que a CLI entende. Ele é o short name de um template que está instalado e disponível para o &lt;code&gt;dotnet new&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq1qwtr01luf1w2xgiahw.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq1qwtr01luf1w2xgiahw.png" alt="console" width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para o nosso desafio vamos criar uma aplicação Console chamada &lt;code&gt;Dia03&lt;/code&gt; usando o comando conhecido &lt;code&gt;dotnet new console -n Dia03&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A opção &lt;code&gt;-n&lt;/code&gt; é a forma curta de &lt;code&gt;--name&lt;/code&gt; e define o nome do que estamos criando. Depois do comando, podemos entrar na pasta. E pronto, nosso projeto foi criado sem abrir nenhuma IDE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0rfitt82utoj0r33tgk7.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0rfitt82utoj0r33tgk7.png" alt="resultado ls" width="605" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet build&lt;/code&gt; — vamos ver se isso compila
&lt;/h2&gt;

&lt;p&gt;Agora temos código, mas precisamos transformá-lo em algo que o .NET consiga executar. É aí que entra o nosso &lt;code&gt;dotnet build&lt;/code&gt; do Dia 01.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quando executamos esse comando, o .NET usa o MSBuild para construir o projeto e suas dependências. O código C# passa pelo processo de compilação que vimos no Dia 01 e os arquivos resultantes começam a aparecer naquela estrutura de &lt;code&gt;bin&lt;/code&gt; e &lt;code&gt;obj&lt;/code&gt; que vimos no Dia 02.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por padrão, o build utiliza a configuração &lt;code&gt;Debug&lt;/code&gt;, então podemos encontrar nossos arquivos em uma estrutura parecida com:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79lvsapqicrg2d2wsuyf.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79lvsapqicrg2d2wsuyf.png" alt="Visualização das pastas" width="363" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas também podemos escolher outra configuração com o uso do Release: &lt;code&gt;dotnet build -c Release&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;-c&lt;/code&gt; é a forma curta de &lt;code&gt;--configuration&lt;/code&gt; e, nesse caso, estamos pedindo um build utilizando a configuração &lt;code&gt;Release&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;De forma simplificada, Debug é a configuração pensada para o desenvolvimento e depuração da aplicação, enquanto Release é a configuração utilizada quando queremos um build otimizado para distribuição. Olha como adiciona pastas ao &lt;code&gt;obj&lt;/code&gt; e &lt;code&gt;bin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fess1mg7b7kea8tu8qxp2.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fess1mg7b7kea8tu8qxp2.png" alt="Eu disse que nao iaaa" width="587" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então o &lt;code&gt;dotnet build&lt;/code&gt; não está executando nossa aplicação. Ele está construindo nosso projeto e verificando se aquele código consegue ser compilado com sucesso. Se tiver um belo erro de compilação no meio do caminho, ele vai nos contar. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet run&lt;/code&gt; — esse aqui a gente já conhece
&lt;/h2&gt;

&lt;p&gt;Depois de três dias falando sobre .NET, o &lt;code&gt;dotnet run&lt;/code&gt; já está quase virando membro da família e almoçando no domingo com a gente&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ccq1b3e33pxwh2m0uly.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ccq1b3e33pxwh2m0uly.png" alt="Resultado dotnet run" width="432" height="52"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse comando executa nossa aplicação e, quando necessário, realiza o processo de build antes disso. Se quiser saber mais sobre esse processo de build você pode ler o &lt;a href="https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h"&gt;Dia 01&lt;/a&gt; também.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet test&lt;/code&gt; — agora vamos deixar o QA feliz
&lt;/h2&gt;

&lt;p&gt;Temos uma aplicação que cria, compila e executa, mas ainda falta uma coisa importante: &lt;del&gt;90% de cobertura de&lt;/del&gt; testes.&lt;/p&gt;

&lt;p&gt;Se tentarmos explorar o &lt;code&gt;dotnet test&lt;/code&gt; no nosso projeto Console, não temos nenhum teste para executar. Então vamos aproveitar a própria CLI para criar um projeto de testes.&lt;/p&gt;

&lt;p&gt;Voltando para a pasta onde está nosso projeto &lt;code&gt;Dia03&lt;/code&gt;, podemos executar &lt;code&gt;dotnet new xunit -n Dia03.Tests&lt;/code&gt; pra criar esse projeto. Não vou entrar nos detalhes desse comando hoje.&lt;/p&gt;

&lt;p&gt;Agora temos dois projetos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoahldegvalhwodscmr5.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkoahldegvalhwodscmr5.png" alt="Print do terminal com os dois projetos" width="685" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O template &lt;code&gt;xunit&lt;/code&gt; cria um projeto de testes utilizando xUnit um framework de testes para o .NET. Ele nos da as ferramentas e convenções que usamos para escrever testes automatizados em C#, principalmente testes unitários.&lt;/p&gt;

&lt;p&gt;Como queremos que nossos testes consigam acessar o projeto que estamos testando, adicionamos uma referência entre eles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet reference add ../Dia03/Dia03.csproj &lt;span class="nt"&gt;--project&lt;/span&gt; Dia03.Tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A referência fica registrada no &lt;code&gt;.csproj&lt;/code&gt; do projeto de testes através de um &lt;code&gt;ProjectReference&lt;/code&gt;, bem parecido com o que vimos ontem quando adicionamos um pacote NuGet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fioyvxf8s3scxmttdkkgf.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fioyvxf8s3scxmttdkkgf.png" alt="Eu disse que não ia abrir a IDE" width="508" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora podemos executar nossos testes e ver o resultado&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqsi7bxk9i5ym2wyhr38g.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqsi7bxk9i5ym2wyhr38g.png" alt="Sucesso" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O comando faz o build dos projetos necessários e executa os testes encontrados no projeto de testes. No final recebemos o resultado diretamente no terminal, mostrando quantos testes passaram, falharam ou foram ignorados.&lt;/p&gt;

&lt;p&gt;Não vou entrar em xUnit e estrutura de testes agora porque isso merece um dia próprio. O importante aqui é que conseguimos criar o projeto de testes e executá-lo sem precisar abrir o Test Explorer do Visual Studio.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;dotnet publish&lt;/code&gt; — terminou, agora precisamos entregar
&lt;/h2&gt;

&lt;p&gt;Até agora criamos nosso projeto, compilamos, executamos e rodamos os testes. Falta preparar nossa aplicação para sair da nossa máquina com o &lt;code&gt;dotnet publish&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Uma dúvida que eu já tive é: se &lt;code&gt;dotnet build&lt;/code&gt; já compilou minha aplicação, para que existe o &lt;code&gt;dotnet publish&lt;/code&gt;? Os dois realmente passam pelo processo de build, mas têm objetivos diferentes.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;dotnet build&lt;/code&gt; está focado em construir o projeto, gerando os binários necessários para desenvolvimento e validação do código. Já o &lt;code&gt;dotnet publish&lt;/code&gt; prepara a aplicação e suas dependências para que ela possa ser implantada em outro ambiente.&lt;/p&gt;

&lt;p&gt;Podemos publicar nossa aplicação em Release com o comando &lt;code&gt;dotnet publish -c Release&lt;/code&gt; e ver uma pasta parecida com essa&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzpji42cmf59bzvpfsezz.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzpji42cmf59bzvpfsezz.png" alt="Publish!" width="604" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dentro de &lt;code&gt;publish&lt;/code&gt; ficam os arquivos que fazem parte da saída publicada da nossa aplicação. Então uma forma simples de pensar é que o &lt;code&gt;build&lt;/code&gt; responde algo próximo de " eu consigo construir esse projeto?", enquanto o &lt;code&gt;publish&lt;/code&gt; responde "quais arquivos eu preciso preparar para distribuir essa aplicação?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Parece bastante coisa &lt;del&gt;e é&lt;/del&gt; mas a própria CLI pode ajudar a gente nas horas do desespero&lt;/p&gt;

&lt;h2&gt;
  
  
  Não decore tudo, pergunte para a própria CLI
&lt;/h2&gt;

&lt;p&gt;Até agora usamos várias opções nos comandos que viram letrinhas soltas &lt;code&gt;-n&lt;/code&gt;, &lt;code&gt;-c&lt;/code&gt;. E a lista fica muito maior conforme começamos a explorar a CLI, no final a gente tá digitando sem nem saber o porquê. Não é mais nosso intuito certo? A boa notícia é que não precisamos decorar todos esses comandos e opções.&lt;/p&gt;

&lt;p&gt;Podemos pedir ajuda diretamente no terminal com o &lt;code&gt;dotnet --help&lt;/code&gt; ou, melhor ainda, pedir ajuda para um comando específico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet build &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet run &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--help&lt;/span&gt;
dotnet publish &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fikl9mfsavran1n47j3mx.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fikl9mfsavran1n47j3mx.png" alt="Heeeelp!" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso mostra a descrição do comando, seus argumentos e as opções disponíveis. Para mim, saber que uma opção existe e saber onde encontrá-la é muito mais útil do que tentar decorar cinquenta parâmetros que eu talvez use duas vezes no ano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do zero ao publish sem Visual Studio
&lt;/h2&gt;

&lt;p&gt;Começamos o dia sem abrir o Visual Studio e passamos por praticamente todo o ciclo básico da nossa aplicação usando apenas a .NET CLI. Isso não significa que amanhã vou desinstalar o Visual Studio e começar a desenvolver tudo pelo CMD (Deus me dibre). A IDE existe justamente para facilitar nossa vida e automatizar várias dessas tarefas. Obrigada Microsoft.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mas existe uma diferença enorme entre deixar uma ferramenta fazer alguma coisa por nós e não saber o que ela está fazendo por nós. Dá pra ficar horas filosofando sobre isso e o uso da IA mas, vamos deixar esse papo pra um café.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando clicamos em Build, executamos os testes pelo Test Explorer ou publicamos uma aplicação pela interface do Visual Studio, existem ferramentas e comandos do .NET trabalhando por trás dessas facilidades. Conhecer a CLI ajuda a entender melhor esse processo e também faz bastante diferença quando saímos da nossa máquina e encontramos ambientes onde não existe um botão bonitinho para clicar, como pipelines de CI/CD, containers e servidores.&lt;/p&gt;

&lt;p&gt;O Visual Studio descansou hoje mas pode abrir de novo amanhã.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/dotnet/core/tools/" rel="noopener noreferrer"&gt;.NET CLI overview — Microsoft Learn&lt;/a&gt; e as subpáginas com os comandos &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>learning</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>O que o .csproj conta sobre o seu projeto .NET</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Sat, 03 Oct 2026 00:35:13 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/o-que-o-csproj-conta-sobre-o-seu-projeto-net-1j7l</link>
      <guid>https://dev.to/bea_tavernaro/o-que-o-csproj-conta-sobre-o-seu-projeto-net-1j7l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇺🇸 Prefer reading in English? &lt;a href="https://dev.to/bea_tavernaro/what-does-the-csproj-file-tell-you-about-your-net-project-5dhd"&gt;Read the English version.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h"&gt;No primeiro dia dos 30 dias de .NET&lt;/a&gt; eu fui entender o que acontece por trás de um simples &lt;code&gt;dotnet run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mas antes do &lt;code&gt;dotnet run&lt;/code&gt; existe o projeto em si.&lt;/p&gt;

&lt;p&gt;Quando criamos uma aplicação .NET, mesmo a mais simples possível, alguns arquivos e pastas já aparecem automaticamente. &lt;code&gt;Program.cs&lt;/code&gt;, &lt;code&gt;.csproj&lt;/code&gt;, &lt;code&gt;obj&lt;/code&gt;, depois &lt;code&gt;bin&lt;/code&gt; e a gente simplesmente segue programando sem se preocupar em entender.&lt;/p&gt;

&lt;p&gt;Eu mesma já abri um &lt;code&gt;.csproj&lt;/code&gt; várias vezes para instalar um pacote, mudar alguma configuração ou conferir a versão do .NET e depois fechei sem entender direito o que tinha feito.&lt;/p&gt;

&lt;p&gt;Então hoje resolvi abrir essa caixinha e entender para que serve cada uma dessas coisas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o projeto mais simples possível
&lt;/h2&gt;

&lt;p&gt;Vamos começar criando uma aplicação Console:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flh9ioalg99y6fymeiy7w.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flh9ioalg99y6fymeiy7w.png" alt="Resultado do comando no terminal" width="532" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;dotnet new&lt;/code&gt; cria projetos e outros arquivos a partir de templates. Nesse caso estamos usando o template &lt;code&gt;console&lt;/code&gt; e dando ao projeto o nome &lt;code&gt;Dia02&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Entrando na pasta temos uma estrutura parecida com essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7u4z6j656kpmjw5aj5t.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu7u4z6j656kpmjw5aj5t.png" alt="Resultado do comando no terminal" width="621" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pouca coisa pra começar, mas já temos bastante coisa para entender aqui.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;Program.cs&lt;/code&gt; — onde tudo começa
&lt;/h2&gt;

&lt;p&gt;Abrindo o &lt;code&gt;Program.cs&lt;/code&gt; de uma aplicação Console moderna encontramos algo parecido com:&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="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;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;Program.cs&lt;/code&gt; é o arquivo onde encontramos o ponto de entrada da aplicação. É onde a execução do nosso programa começa e, em aplicações maiores, normalmente é onde configuramos e inicializamos os componentes necessários antes da aplicação começar a trabalhar de fato.&lt;/p&gt;

&lt;p&gt;Se você já viu projetos C# mais antigos, talvez esteja sentindo falta de algumas coisas no &lt;code&gt;Program.cs&lt;/code&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="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="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;"Hello, World!"&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;Desde o C# 9 temos os Top-level statements, que permitem escrever o código do ponto de entrada da aplicação sem declarar explicitamente uma classe &lt;code&gt;Program&lt;/code&gt; e um método &lt;code&gt;Main&lt;/code&gt;, como no segundo exemplo. O compilador gera o ponto de entrada necessário para nós, deixando o &lt;code&gt;Program.cs&lt;/code&gt; bem menos verboso e mais bonito.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;.csproj&lt;/code&gt; — o arquivo que descreve nosso projeto
&lt;/h2&gt;

&lt;p&gt;Agora chegamos no arquivo mais importante do artigo.&lt;/p&gt;

&lt;p&gt;Se abrirmos o &lt;code&gt;Dia02.csproj&lt;/code&gt;, vamos encontrar algo parecido com:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficaejf7td4uvkeud2kl2.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ficaejf7td4uvkeud2kl2.png" alt="Arquivo csproj" width="575" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É no &lt;code&gt;.csproj&lt;/code&gt; que ficam várias informações que dizem ao sistema de build como aquele projeto deve ser tratado: qual SDK utilizar, qual framework ele tem como alvo, referências a pacotes, referências a outros projetos e diversas configurações de compilação. Aah, e é um arquivo XML.&lt;/p&gt;

&lt;p&gt;Olhando para o nosso exemplo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Project Sdk="Microsoft.NET.Sdk"&amp;gt;&lt;/code&gt; : define o &lt;strong&gt;Project SDK&lt;/strong&gt; utilizado pelo projeto. Nesse caso estamos usando o SDK base do .NET. Em uma aplicação ASP.NET Core, por exemplo, é comum encontrarmos &lt;code&gt;Microsoft.NET.Sdk.Web&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/code&gt; : agrupa propriedades e configurações do projeto. Ele não define uma configuração específica sozinho, mas funciona como um "grupo" para as propriedades que estão dentro dele.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;OutputType&amp;gt;Exe&amp;lt;/OutputType&amp;gt;&lt;/code&gt; : define o tipo de saída que será gerada pelo projeto. &lt;code&gt;Exe&lt;/code&gt; indica que estamos construindo uma aplicação executável.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;TargetFramework&amp;gt;net10.0&amp;lt;/TargetFramework&amp;gt;&lt;/code&gt; : define para qual Target Framework o projeto será construído. No exemplo, nosso alvo é o .NET 10. Isso não quer dizer "qual SDK tenho instalado", mas sim qual framework essa aplicação tem como alvo.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;ImplicitUsings&amp;gt;enable&amp;lt;/ImplicitUsings&amp;gt;&lt;/code&gt; : faz com que o SDK adicione automaticamente alguns &lt;code&gt;using&lt;/code&gt; comuns ao projeto. É por isso que conseguimos usar coisas como &lt;code&gt;Console.WriteLine()&lt;/code&gt; sem necessariamente escrever &lt;code&gt;using System;&lt;/code&gt; no começo do arquivo.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;Nullable&amp;gt;enable&amp;lt;/Nullable&amp;gt;&lt;/code&gt; : habilita o contexto de &lt;strong&gt;Nullable Reference Types&lt;/strong&gt;, permitindo que o compilador nos avise sobre situações em que uma referência pode ser &lt;code&gt;null&lt;/code&gt;. Por exemplo, ele passa a diferenciar &lt;code&gt;string nome&lt;/code&gt; de &lt;code&gt;string? nome&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  E quando instalamos um pacote NuGet?
&lt;/h2&gt;

&lt;p&gt;Agora vamos mexer um pouquinho no nosso projeto.&lt;/p&gt;

&lt;p&gt;Podemos adicionar um pacote usando a CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet package add Dapper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso, se abrirmos novamente nosso &lt;code&gt;.csproj&lt;/code&gt;, alguma coisa nova apareceu:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4yext9zjhx40bere1bui.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4yext9zjhx40bere1bui.png" alt="Dapper adicionado ao projeto" width="696" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos entender o que apareceu de novo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;ItemGroup&amp;gt;&lt;/code&gt; : enquanto o &lt;code&gt;PropertyGroup&lt;/code&gt; agrupa &lt;strong&gt;propriedades e configurações&lt;/strong&gt;, o &lt;code&gt;ItemGroup&lt;/code&gt; agrupa itens que fazem parte ou são utilizados pelo projeto, como pacotes, referências a outros projetos e arquivos.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;PackageReference Include="Dapper" Version="..." /&amp;gt;&lt;/code&gt; : declara uma dependência de um pacote NuGet. O &lt;code&gt;Include="Dapper"&lt;/code&gt; informa qual pacote queremos utilizar e o &lt;code&gt;Version="..."&lt;/code&gt; informa &lt;strong&gt;qual versão&lt;/strong&gt; desse pacote o projeto utiliza.&lt;/p&gt;

&lt;p&gt;Ao instalar um pacote NuGet, a dependência fica registrada no próprio &lt;code&gt;.csproj&lt;/code&gt;, junto com a versão que o projeto utiliza. É também por isso que não precisamos enviar os pacotes junto com nosso código para o Git. Quando outra pessoa clona o projeto, o .NET consegue ler os &lt;code&gt;PackageReference&lt;/code&gt; e restaurar as dependências necessárias.&lt;/p&gt;

&lt;h2&gt;
  
  
  E de onde surgiram &lt;code&gt;bin&lt;/code&gt; e &lt;code&gt;obj&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Quando executamos o &lt;code&gt;dotnet build&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00idvl5fxq7fc05kdagc.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00idvl5fxq7fc05kdagc.png" alt="resultado do dotnet build" width="566" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;o .NET inicia o processo de build do nosso projeto e, no meio disso, duas pastas que provavelmente todo desenvolvedor .NET já encontrou são atualizadas ou aparecem: &lt;code&gt;bin&lt;/code&gt; e &lt;code&gt;obj&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqntmcxa8o4nx2u01ql2w.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqntmcxa8o4nx2u01ql2w.png" alt="bin e obj" width="600" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apesar de as duas estarem relacionadas ao processo de build, elas têm funções diferentes.&lt;/p&gt;

&lt;p&gt;A pasta &lt;code&gt;bin&lt;/code&gt; é onde ficam os principais arquivos resultantes da compilação da nossa aplicação. Dentro dela, o .NET organiza esses arquivos de acordo com a configuração utilizada no build e o Target Framework do projeto. &lt;/p&gt;

&lt;p&gt;Já a pasta &lt;code&gt;obj&lt;/code&gt; funciona como uma área de trabalho do processo de build. Enquanto o resultado que nos interessa vai para &lt;code&gt;bin&lt;/code&gt;, durante a compilação o .NET e o MSBuild precisam gerar e armazenar diversos arquivos intermediários. É na &lt;code&gt;obj&lt;/code&gt; que essas informações ficam.&lt;/p&gt;

&lt;p&gt;Normalmente, nenhuma das duas é versionada no Git. Se apagarmos &lt;code&gt;bin&lt;/code&gt; e &lt;code&gt;obj&lt;/code&gt; e executarmos novamente o &lt;code&gt;dotnet build&lt;/code&gt;, o .NET gera de novo o que for necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;Na correria das entregas é muito fácil simplesmente criar o projeto, instalar os pacotes, rodar um &lt;code&gt;dotnet build&lt;/code&gt; e seguir a vida sem pensar muito no que está acontecendo por trás de tudo isso. E, na maior parte do tempo, vai funcionar mesmo. Mas entender como o projeto está estruturado e de onde o .NET tira as informações que precisa para construir nossa aplicação faz bastante diferença quando alguma coisa deixa de funcionar como esperado &lt;del&gt;quase o tempo todo&lt;/del&gt;. Quanto mais entendemos as ferramentas que usamos todos os dias, mais fácil fica investigar um erro e, por consequência, mais fácil e rápido fica entregar a task.&lt;/p&gt;

&lt;p&gt;Até amanhã!&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/project-sdk/overview" rel="noopener noreferrer"&gt;.NET Project SDK overview — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props" rel="noopener noreferrer"&gt;MSBuild properties for Microsoft.NET.Sdk — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/dotnet/standard/frameworks" rel="noopener noreferrer"&gt;Target frameworks in SDK-style projects — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/dotnet/csharp/fundamentals/program-structure/top-level-statements" rel="noopener noreferrer"&gt;Top-level statements — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files" rel="noopener noreferrer"&gt;Package references in project files — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items" rel="noopener noreferrer"&gt;Common MSBuild project items — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>braziliandevs</category>
      <category>dotnet</category>
      <category>csharp</category>
      <category>learning</category>
    </item>
    <item>
      <title>O que realmente acontece quando você digita dotnet run?</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Thu, 01 Oct 2026 21:29:41 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h</link>
      <guid>https://dev.to/bea_tavernaro/o-que-realmente-acontece-quando-voce-digita-dotnet-run-f8h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇺🇸 Prefer reading in English? &lt;a href="https://dev.to/bea_tavernaro/what-really-happens-when-you-run-dotnet-run-2ohi"&gt;Read the English version here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se você trabalha com .NET, provavelmente já digitou esse comando muitas e muitas vezes:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;E alguns segundos depois sua aplicação está rodando. Simples assim.&lt;/p&gt;

&lt;p&gt;Mas o que realmente aconteceu entre você apertar Enter e a sua aplicação começar a executar?&lt;/p&gt;

&lt;p&gt;Quem encontrou o projeto? Quem compilou o código C#? O que é gerado durante essa compilação? O processador consegue executar C# diretamente? Onde entram o SDK, o Runtime e o CLR nessa história?&lt;/p&gt;

&lt;p&gt;Foi justamente tentando responder essa pergunta que escolhi o tema do primeiro dia dos meus &lt;strong&gt;30 dias de .NET&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Então vamos seguir o caminho de um &lt;code&gt;dotnet run&lt;/code&gt;, do terminal até a execução da aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Você digita &lt;code&gt;dotnet run&lt;/code&gt; no terminal
&lt;/h2&gt;

&lt;p&gt;A primeira peça que encontramos é o &lt;strong&gt;.NET CLI (Command-Line Interface)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Mas o que é um CLI?&lt;/p&gt;

&lt;p&gt;A CLI é uma interface que permite interagir com um programa através de comandos escritos. Então não, a CLI não é exatamente a "tela preta" do terminal. O terminal é o programa que usamos para digitar os comandos, enquanto a .NET CLI é a ferramenta que recebe e interpreta comandos como o &lt;code&gt;dotnet run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No Windows, por exemplo, podemos usar a .NET CLI através do PowerShell, Prompt de Comando ou Windows Terminal. No Linux e macOS, podemos utilizá-la através dos seus respectivos terminais.&lt;/p&gt;

&lt;p&gt;Quando instalamos o .NET SDK, temos acesso ao comando &lt;code&gt;dotnet&lt;/code&gt;, que funciona como o ponto de entrada para várias ferramentas da plataforma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new       &lt;span class="c"&gt;# cria um novo projeto a partir de um template&lt;/span&gt;
dotnet restore   &lt;span class="c"&gt;# restaura as dependências do projeto&lt;/span&gt;
dotnet build     &lt;span class="c"&gt;# compila o projeto&lt;/span&gt;
dotnet &lt;span class="nb"&gt;test&lt;/span&gt;      &lt;span class="c"&gt;# executa os testes&lt;/span&gt;
dotnet run       &lt;span class="c"&gt;# compila e executa a aplicação&lt;/span&gt;
dotnet publish   &lt;span class="c"&gt;# prepara a aplicação para ser distribuída&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando executamos &lt;code&gt;dotnet run&lt;/code&gt; estamos basicamente dizendo: encontre meu projeto, prepare-o para execução e execute-o.&lt;/p&gt;

&lt;p&gt;Mas a CLI não apareceu magicamente na nossa máquina. Ela veio junto com outra peça importante: o &lt;strong&gt;.NET SDK&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O SDK - Software Development Kit
&lt;/h2&gt;

&lt;p&gt;O SDK reúne as ferramentas necessárias para nós, desenvolvedores, conseguirmos criar nossas aplicações .NET. Quase como uma caixinha de ferramentas que tem martelo e chave de fenda, o SDK tem a CLI, ferramentas de build, compiladores, bibliotecas e outros componentes necessários para essa construção.&lt;/p&gt;

&lt;p&gt;Por conta desse conjunto todo, quando vamos desenvolver uma aplicação precisamos verificar se o SDK está instalado. Podemos descobrir quais estão instalados usando o comando:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35zkylnmlohvtn4ugiew.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35zkylnmlohvtn4ugiew.png" alt="Terminal com o resultado do comando dotnet --list-sdks" width="334" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, quando executamos o &lt;code&gt;dotnet run&lt;/code&gt;, estamos utilizando as ferramentas fornecidas pelo SDK para preparar nossa aplicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  O código C# precisa ser compilado, certo?
&lt;/h2&gt;

&lt;p&gt;Nosso processador não entende absolutamente nada da frase solta:&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="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;"Help, não entendo"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de escrito e antes de ser executado, o nosso código C# precisa passar por um processo de compilação, ou seja, ser compilado.&lt;/p&gt;

&lt;p&gt;Compilar significa, de forma simplificada, transformar o código que escrevemos em uma representação que possa seguir para as próximas etapas de execução. No caso do C#, o compilador transforma nosso código em &lt;strong&gt;IL (Intermediate Language)&lt;/strong&gt; e adiciona junto metadados sobre o nosso código.&lt;/p&gt;

&lt;p&gt;O IL é uma linguagem intermediária. Ou seja, nesse momento ainda não estamos falando a "lingua das máquinas" que será executada pelo processador.&lt;/p&gt;

&lt;p&gt;É nessa parte que começamos a sair do território do SDK e entrar no processo de execução da aplicação de fato.&lt;/p&gt;

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

&lt;p&gt;O &lt;strong&gt;.NET Runtime&lt;/strong&gt; é o conjunto de componentes necessários para executar uma aplicação .NET depois que ela foi compilada.&lt;/p&gt;

&lt;p&gt;Ele inclui componentes como o &lt;strong&gt;CLR&lt;/strong&gt;, bibliotecas fundamentais do .NET e outros arquivos necessários para que uma aplicação consiga rodar.&lt;/p&gt;

&lt;p&gt;É por isso que SDK e Runtime têm funções diferentes. Se estamos desenvolvendo, precisamos das ferramentas do SDK. Mas, para apenas executar uma aplicação, dependendo da forma como ela foi publicada, podemos precisar somente do Runtime.&lt;/p&gt;

&lt;p&gt;Podemos verificar quais runtimes estão instalados na máquina com:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2o4s1am6d3zj5lfnhbon.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2o4s1am6d3zj5lfnhbon.png" alt="Terminal com o resultado do comando dotnet --list-runtimes" width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando nossa aplicação começa a ser executada, o Runtime fornece o ambiente necessário para que aquela IL que geramos anteriormente possa finalmente rodar.&lt;/p&gt;

&lt;p&gt;E uma das peças mais importantes desse processo é o CLR.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLR - Common Language Runtime
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;CLR (Common Language Runtime)&lt;/strong&gt; é o ambiente responsável pela execução do código gerenciado do .NET.&lt;/p&gt;

&lt;p&gt;Mas ele não simplesmente "roda o código". Durante a execução, o CLR cuida de várias coisas a mais para nós. Quando criamos objetos no nosso código, por exemplo, precisamos de memória para armazenar todos eles. O CLR participa do gerenciamento dessa memória e o Garbage Collector identifica objetos que não estão mais sendo utilizados para liberar espaço.&lt;/p&gt;

&lt;p&gt;Ele também fornece outros serviços que usamos constantemente sem precisar implementar tudo manualmente, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gerenciamento de memória;&lt;/li&gt;
&lt;li&gt;tratamento de exceções;&lt;/li&gt;
&lt;li&gt;gerenciamento de threads;&lt;/li&gt;
&lt;li&gt;segurança de tipos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Durante a execução tradicional, entra também o &lt;strong&gt;JIT — Just-In-Time compiler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ele transforma o IL (Intermediate Language que vimos ali em cima) em código de máquina que o processador daquela máquina consegue executar.&lt;/p&gt;

&lt;p&gt;E aqui tem uma coisa muito importante do .NET: o fato dele ser Multiplataforma&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft5x0kgjk6nwbbmoecm3d.png" class="article-body-image-wrapper"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft5x0kgjk6nwbbmoecm3d.png" alt="Descrição do dotnet no site da Microsoft" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O IL gerado na compilação é intermediário e não está diretamente preso às instruções de uma CPU específica. Quando a aplicação é executada, o Runtime apropriado para aquela plataforma participa da execução e o JIT gera código de máquina adequado à arquitetura do processador. O mesmo código .NET pode rodar em Windows, Linux e macOS desde que exista suporte do .NET para aquele sistema operacional e arquitetura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Juntando tudo
&lt;/h2&gt;

&lt;p&gt;Agora conseguimos enxergar o caminho inteiro:&lt;/p&gt;

&lt;p&gt;Tudo isso começou com um único comando de duas palavras, talvez o mais utilizado:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Então qual é a diferença entre SDK, CLI, Runtime e CLR?
&lt;/h2&gt;

&lt;p&gt;Depois de acompanhar o caminho do comando, as definições ficam bem menos abstratas. Segue um resuminho pra guardar na memória (a sua, não do computador)&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Termo&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Em um tweet&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SDK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conjunto de ferramentas que usamos para desenvolver aplicações .NET.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Interface de linha de comando através da qual acessamos várias ferramentas do .NET.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Conjunto de componentes necessários para executar uma aplicação .NET.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLR&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ambiente de execução do código gerenciado.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linguagem intermediária gerada a partir da compilação do código C#.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JIT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compilador que transforma o IL em código de máquina.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Então, em vez de decorar quatro definições separadas, podemos pensar nelas como peças que participam de momentos diferentes da vida da nossa aplicação.&lt;/p&gt;

&lt;p&gt;E da próxima vez que eu digitar &lt;code&gt;dotnet run&lt;/code&gt;, vou saber o tanto de coisa que está acontecendo por trás daquele comando.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/core/sdk" rel="noopener noreferrer"&gt;.NET SDK overview — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/core/tools/" rel="noopener noreferrer"&gt;.NET CLI overview — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/core/tools/dotnet" rel="noopener noreferrer"&gt;dotnet command — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/standard/clr" rel="noopener noreferrer"&gt;Common Language Runtime (CLR) — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/standard/managed-execution-process" rel="noopener noreferrer"&gt;Managed execution process — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/standard/garbage-collection/" rel="noopener noreferrer"&gt;Garbage Collection — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals" rel="noopener noreferrer"&gt;Fundamentals of Garbage Collection — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/core/project-sdk/overview" rel="noopener noreferrer"&gt;.NET Project SDK overview — Microsoft Learn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>braziliandevs</category>
      <category>learning</category>
    </item>
    <item>
      <title>Student Benefit Programs in Tech</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Tue, 03 Mar 2026 18:28:36 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/student-benefit-programs-in-tech-m48</link>
      <guid>https://dev.to/bea_tavernaro/student-benefit-programs-in-tech-m48</guid>
      <description>&lt;p&gt;The beginning of the year always brings a new wave of students entering college, and there’s no better time to talk about the countless benefits available to students — especially those in technology.&lt;/p&gt;

&lt;p&gt;I had written a Twitter thread about this last year, but I decided to organize everything here to make it easier to find and share.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are these benefits?
&lt;/h2&gt;

&lt;p&gt;They are initiatives that offer free access, credits, or discounts on professional tools, cloud services, and learning platforms. The main goal is to reduce the barrier to entry for students, allowing them to use real-world technologies without having to bear high costs.&lt;/p&gt;

&lt;p&gt;For the companies that provide them, the long-term strategy is to develop future professionals who are already familiar with their solutions, encourage continued adoption in the job market, influence technical decisions in the organizations where these students will work, and strengthen their ecosystem with skilled developers — creating a mutually beneficial relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get access?
&lt;/h2&gt;

&lt;p&gt;To access most of these benefits, you need to prove enrollment in an educational institution. Platforms usually require a valid academic email address, typically provided by the university, with an institutional domain (such as @institution.edu or similar).&lt;/p&gt;

&lt;p&gt;During registration, the company sends a verification request to that email address, and the student must confirm it to validate access. In some cases, proof of enrollment may also be required.&lt;/p&gt;

&lt;p&gt;To verify your information and obtain access to your student email, you need to contact your university, as each institution has its own process for creating, activating, and recovering this type of account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here’s a tip
&lt;/h2&gt;

&lt;p&gt;You can build an entire portfolio at virtually no cost using these benefits. Some project ideas that can leverage everything you’ll find here include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metrics and analytics dashboard&lt;/strong&gt; – A web application with dynamic charts, filters, authentication, and API consumption simulating a real market product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST API structured with Clean Architecture&lt;/strong&gt; – A complete backend with authentication, versioning, unit tests, Swagger documentation, and cloud deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mini microservices architecture&lt;/strong&gt; – Separation of services (users, orders, fake payments) with communication between them and independent deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public data dashboard with simple ETL&lt;/strong&gt; – Collecting data from a public API, processing it with Python, and displaying it in an interactive web dashboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documented redesign of a legacy system&lt;/strong&gt; – A case study including research, persona definition, wireframes, and a navigable prototype in Figma.&lt;/p&gt;

&lt;p&gt;And of course, deploying your own personal portfolio on a custom domain!&lt;/p&gt;




&lt;p&gt;Now let’s get to what really matters. Here is the list. The GitHub Student Developer Pack appears first because it’s the main gateway to several other benefits and partnerships. The others are organized alphabetically for easier reference.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Student Developer Pack
&lt;/h2&gt;

&lt;p&gt;Link: GitHub Student Developer Pack – GitHub Education&lt;/p&gt;

&lt;p&gt;The largest hub of benefits for student developers. With it, you can earn your first certification for free.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GH-900: GitHub Foundations Certification&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;Visual Studio&lt;/li&gt;
&lt;li&gt;Cloud service credits&lt;/li&gt;
&lt;li&gt;Free domain&lt;/li&gt;
&lt;li&gt;Database and hosting tools&lt;/li&gt;
&lt;li&gt;Course and learning platforms&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  AWS Educate
&lt;/h2&gt;

&lt;p&gt;Link: AWS Educate&lt;/p&gt;

&lt;p&gt;Entry-level AWS cloud program focused on education.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US$75–100 in promotional credits&lt;/li&gt;
&lt;li&gt;Courses, hands-on labs, and cloud learning materials&lt;/li&gt;
&lt;li&gt;Cloud Career Pathways (guided learning tracks)&lt;/li&gt;
&lt;li&gt;Access to the AWS Educate Job Board with cloud-related career opportunities&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Azure for Students
&lt;/h2&gt;

&lt;p&gt;Link: Azure for Students | Microsoft Azure&lt;/p&gt;

&lt;p&gt;One of the most powerful benefits available. You get access to all Azure resources and can use some for free or spend the $100 in credits you receive upon signing up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$100 in credits valid for up to 1 year&lt;/li&gt;
&lt;li&gt;Free monthly amounts of 20+ popular services for 12 months&lt;/li&gt;
&lt;li&gt;All Azure resources, including Azure AI Foundry with the latest AI models&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Canva
&lt;/h2&gt;

&lt;p&gt;Link: Canva Education Solutions&lt;/p&gt;

&lt;p&gt;Complete visual creation suite.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Premium resources unlocked (templates, images, videos, audio, graphic elements)&lt;/li&gt;
&lt;li&gt;Creation of presentations, videos, documents, websites, whiteboards, and visual materials&lt;/li&gt;
&lt;li&gt;LMS integrations (Google Classroom, Microsoft Teams, Moodle, Blackboard, Canvas, Schoology, D2L)&lt;/li&gt;
&lt;li&gt;Ready-made Teacher Work Kits&lt;/li&gt;
&lt;li&gt;Exclusive educator community&lt;/li&gt;
&lt;li&gt;Program for educational content creators&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cursor
&lt;/h2&gt;

&lt;p&gt;Link: Cursor · Students&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 free year of the Pro plan for the AI-powered code editor&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  DataCamp
&lt;/h2&gt;

&lt;p&gt;Link: DataCamp Premium Student Plan&lt;/p&gt;

&lt;p&gt;Platform focused on data, Python, and AI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 months free&lt;/li&gt;
&lt;li&gt;Discount after the free period&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  DataDog
&lt;/h2&gt;

&lt;p&gt;Link: Free Datadog accounts for students | Datadog&lt;/p&gt;

&lt;p&gt;Monitoring and observability tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data storage for 15 months&lt;/li&gt;
&lt;li&gt;Team collaboration&lt;/li&gt;
&lt;li&gt;Technical support from the DataDog team&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  .tech Domain
&lt;/h2&gt;

&lt;p&gt;Link: .TECH domains | GitHub Student Developer Pack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free .tech domain for 1 year&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Figma for Education
&lt;/h2&gt;

&lt;p&gt;Link: Figma for Education | Free Tools for the Classroom&lt;/p&gt;

&lt;p&gt;Professional design and prototyping tool available to students.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full Figma for design and prototyping&lt;/li&gt;
&lt;li&gt;FigJam included for brainstorming and collaboration&lt;/li&gt;
&lt;li&gt;Dev Mode for layout inspection and code generation&lt;/li&gt;
&lt;li&gt;Access to the Community with ready-made templates and resources&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  GitKraken Student Plan
&lt;/h2&gt;

&lt;p&gt;Link: GitKraken’s Git Tools Free For Students | GitKraken&lt;/p&gt;

&lt;p&gt;Visual tools for Git and version control.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6 months free&lt;/li&gt;
&lt;li&gt;Discount while maintaining a valid student email&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Google Cloud for Students
&lt;/h2&gt;

&lt;p&gt;Link: Google Cloud for Students&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200 credits on Google Skills Boost&lt;/li&gt;
&lt;li&gt;Free hands-on labs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Heroku for Students
&lt;/h2&gt;

&lt;p&gt;Link: Heroku for Students&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monthly credit for application deployment and hosting&lt;/li&gt;
&lt;li&gt;US$13/month for 24 months&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  JetBrains Student Pack
&lt;/h2&gt;

&lt;p&gt;Link: JetBrains Student Pack&lt;/p&gt;

&lt;p&gt;One of my favorites. Having access to the most widely used IDEs helps a lot with learning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free access to all JetBrains professional IDEs while you are a student, including IntelliJ IDEA, PyCharm, WebStorm, CLion, Rider, DataGrip, and others&lt;/li&gt;
&lt;li&gt;40% discount for up to 2 years after graduation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  MongoDB
&lt;/h2&gt;

&lt;p&gt;Link: MongoDB Student Pack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free MongoDB certification&lt;/li&gt;
&lt;li&gt;$50 in MongoDB Atlas credits&lt;/li&gt;
&lt;li&gt;Learning paths&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Notion for Education
&lt;/h2&gt;

&lt;p&gt;Link: Notion for Students&lt;/p&gt;

&lt;p&gt;Complete workspace for personal and academic organization.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free Plus plan for students (individual workspace)&lt;/li&gt;
&lt;li&gt;Unlimited pages and blocks&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;More customization and website publishing options&lt;/li&gt;
&lt;li&gt;30-day version history&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Postman Student Expert
&lt;/h2&gt;

&lt;p&gt;Link: Student Expert | Postman Student Program&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access to exclusive API certifications&lt;/li&gt;
&lt;li&gt;Participation in the student API developer community&lt;/li&gt;
&lt;li&gt;Student-focused events and workshops&lt;/li&gt;
&lt;li&gt;Opportunity to become a Postman Student Leader&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Spotify Student
&lt;/h2&gt;

&lt;p&gt;Link: Spotify Student Premium&lt;/p&gt;

&lt;p&gt;Okay, this one isn’t exactly tech-related, but we can say it’s for listening to podcasts while working.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Premium plan for R$ 12.90 per month&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You can finish the year with at least two certifications, a complete portfolio, and a lot of practical, real-world technology knowledge. These benefits can definitely help you stay one step ahead in an increasingly competitive market.&lt;/p&gt;

&lt;p&gt;If you enjoyed it and clicked on at least one link, don’t forget to share it in your university group, with your professors and coordinators. Let’s make tech a more inclusive environment for everyone.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>student</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Programas de Benefícios para Estudantes de Tecnologia</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Tue, 03 Mar 2026 17:48:50 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/programas-de-beneficios-para-estudantes-de-tecnologia-526n</link>
      <guid>https://dev.to/bea_tavernaro/programas-de-beneficios-para-estudantes-de-tecnologia-526n</guid>
      <description>&lt;p&gt;Começo de ano sempre traz uma nova leva de alunos entrando na faculdade e não existe momento melhor pra falar dos inúmeros benefícios disponíveis para estudantes, principalmente os de tecnologia.&lt;br&gt;
Já tinha feito uma thread no Twitter sobre isso no ano passado, mas resolvi organizar tudo aqui pra ficar mais fácil de consultar e compartilhar.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são esses benefícios?
&lt;/h2&gt;

&lt;p&gt;São iniciativas que oferecem acesso gratuito, créditos ou descontos em ferramentas profissionais, serviços em nuvem e plataformas de aprendizado. A ideia principal é reduzir a barreira de entrada de quem está se formando, permitindo que estudantes utilizem tecnologias reais sem arcar com custos elevados. &lt;/p&gt;

&lt;p&gt;Para as empresas que os concedem, a estratégia de longo prazo é formar futuros profissionais já familiarizados com suas soluções, incentivar a adoção contínua no mercado de trabalho, influenciar decisões técnicas nas organizações onde esses estudantes atuarão e fortalecer seu ecossistema com desenvolvedores capacitados, criando uma relação de benefício mútuo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como ter acesso?
&lt;/h2&gt;

&lt;p&gt;Para acessar a maioria desses benefícios, é necessário comprovar vínculo com uma instituição de ensino. Normalmente, as plataformas exigem um &lt;strong&gt;e-mail acadêmico válido&lt;/strong&gt;, geralmente fornecido pela própria universidade, com domínio institucional (como @instituicao.edu.br ou similar).&lt;/p&gt;

&lt;p&gt;Durante o cadastro, a empresa envia uma solicitação de verificação para esse endereço, e o estudante precisa confirmar o e-mail para validar o acesso. Em alguns casos, também pode ser solicitado o envio de um comprovante de matrícula. &lt;/p&gt;

&lt;p&gt;Para verificar seus dados e obter acesso ao e-mail estudantil, é necessário entrar em contato com a sua faculdade, pois cada instituição possui um processo próprio para criação, liberação e recuperação desse tipo de conta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Já fica a dica
&lt;/h2&gt;

&lt;p&gt;Dá pra montar um portfólio inteiro praticamente sem custo usando esses benefícios. Alguma ideias que podem usar tudo o que você encontrar aqui são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard de métricas e analytics – Aplicação web com gráficos dinâmicos, filtros, autenticação e consumo de API simulando um produto real de mercado.&lt;/li&gt;
&lt;li&gt;API REST estruturada com Clean Architecture – Backend completo com autenticação, versionamento, testes unitários, documentação Swagger e deploy em cloud.&lt;/li&gt;
&lt;li&gt;Mini arquitetura de microserviços – Separação de serviços (usuários, pedidos, pagamentos fake) com comunicação entre eles e deploy independente.&lt;/li&gt;
&lt;li&gt;Dashboard de dados públicos com ETL simples – Coleta de dados de API pública, tratamento com Python e visualização interativa em um painel web.&lt;/li&gt;
&lt;li&gt;Redesign documentado de sistema legado – Estudo de caso com pesquisa, definição de personas, wireframes e protótipo navegável no Figma.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E é claro, fazer o deploy do seu próprio portfolio pessoal num dominio próprio!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Vamos ao que interessa então. Aqui está a lista, o GitHub Student Developer Pack aparece em primeiro lugar por ser a principal porta de entrada para diversos outros benefícios e parcerias. Os demais estão organizados em ordem alfabética para facilitar a consulta.&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Student Developer Pack
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://education.github.com/pack/" rel="noopener noreferrer"&gt;GitHub Student Developer Pack - GitHub Education&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O maior hub de benefícios para devs estudantes. Com ele você pode ter gratuitamente sua primeira certificação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certificação GH-900: GitHub Foundations Certification&lt;/li&gt;
&lt;li&gt;Github Copilot&lt;/li&gt;
&lt;li&gt;Visual Studio&lt;/li&gt;
&lt;li&gt;Créditos para serviços em nuvem&lt;/li&gt;
&lt;li&gt;Domínio gratuito&lt;/li&gt;
&lt;li&gt;Ferramentas de banco de dados e hospedagem&lt;/li&gt;
&lt;li&gt;Plataformas de cursos e aprendizado&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  AWS Educate
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://aws.amazon.com/education/awseducate" rel="noopener noreferrer"&gt;AWS Educate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Programa de entrada para cloud AWS com foco educacional.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US$75–100 em créditos promocionais&lt;/li&gt;
&lt;li&gt;Cursos, laboratórios práticos e material sobre cloud&lt;/li&gt;
&lt;li&gt;Cloud Career Pathways (trilhas de aprendizado guiadas)&lt;/li&gt;
&lt;li&gt;Acesso ao AWS Educate Job Board, com vagas e oportunidades de carreira relacionadas à computação em nuvem&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Azure For Students
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://azure.microsoft.com/en-us/free/students/" rel="noopener noreferrer"&gt;Azure for Students | Microsoft Azure&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse é um dos benefícios mais poderosos também. Você tem acesso a todos os recursos do azure e pode utilizar alguns deles gratuitamente ou gastar os $ 100 em créditos que ganha ao se inscrever.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$ 100 em créditos para utilizar por até 1 ano&lt;/li&gt;
&lt;li&gt;Free monthly amounts of 20+ popular services for 12 months&lt;/li&gt;
&lt;li&gt;TODOS os recursos do azure incluindo Azure AI Foundry com os modelos mais recentes de IA&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Canva
&lt;/h2&gt;

&lt;p&gt;Link:  &lt;a href="https://www.canva.com/education/" rel="noopener noreferrer"&gt;Canva Education Solutions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suite completa de criação visual.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recursos premium liberados (templates, imagens, vídeos, áudios e elementos gráficos)&lt;/li&gt;
&lt;li&gt;Criação de apresentações, vídeos, documentos, sites, quadros brancos e materiais visuais&lt;/li&gt;
&lt;li&gt;Integração com LMS (Google Classroom, Microsoft Teams, Moodle, Blackboard, Canvas, Schoology, D2L)&lt;/li&gt;
&lt;li&gt;Kits de ensino prontos (Teacher Work Kits)&lt;/li&gt;
&lt;li&gt;Comunidade exclusiva para educadores&lt;/li&gt;
&lt;li&gt;Programa para criadores de conteúdo educacional&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Cursor
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://cursor.com/students" rel="noopener noreferrer"&gt;Cursor · Students&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 ano gratuito do plano Pro para o editor de código com IA integrado&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  DataCamp
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.datacamp.com/pricing/student" rel="noopener noreferrer"&gt;DataCamp Premium Student Plan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Plataforma focada em dados, Python e IA.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 meses gratuitos&lt;/li&gt;
&lt;li&gt;Desconto após o período&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  DataDog
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.datadoghq.com/blog/datadog-github-student-developer-pack/" rel="noopener noreferrer"&gt;Free Datadog accounts for students | Datadog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ferramenta de monitoramento e observabilidade.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Armazenamento de dados por 15 meses&lt;/li&gt;
&lt;li&gt;Colaboração em equipe&lt;/li&gt;
&lt;li&gt;Suporte técnico da equipe DataDog&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Domínio .tech
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://get.tech/github-student-developer-pack" rel="noopener noreferrer"&gt;.TECH domains | GitHub Student Developer Pack&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domínio .tech gratuito por 1 ano&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Figma for Education
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.figma.com/education/" rel="noopener noreferrer"&gt;Figma for Education | Free Tools for the Classroom&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ferramenta profissional de design e prototipação liberada para estudantes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Figma completo para design e prototipação&lt;/li&gt;
&lt;li&gt;FigJam incluso para brainstorm e colaboração&lt;/li&gt;
&lt;li&gt;Dev Mode para inspeção de layouts e geração de código&lt;/li&gt;
&lt;li&gt;Acesso à Community com templates e recursos prontos&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  GitKraken Student Plan
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.gitkraken.com/github-student-developer-pack-bundle" rel="noopener noreferrer"&gt;GitKraken’s Git Tools Free For Students | GitKraken&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ferramentas visuais para Git e versionamento.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6 meses gratuitos&lt;/li&gt;
&lt;li&gt;Desconto enquanto mantiver e-mail de estudante válido&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Google Cloud Para Alunos
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://cloud.google.com/edu/students" rel="noopener noreferrer"&gt;Google Could For Students&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200 créditos no Google Skills Boost&lt;/li&gt;
&lt;li&gt;Laboratórios práticos gratuitos&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Heroku for Students
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.heroku.com/students/" rel="noopener noreferrer"&gt;Heroku For Students&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crédito mensal para deploy e hospedagem de aplicações.&lt;/li&gt;
&lt;li&gt;US$13/mês por 24 meses&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  JetBrains Student Pack
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.jetbrains.com/pt-br/academy/student-pack/" rel="noopener noreferrer"&gt;JetBrains Student Pack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um dos meus preferidos também. Ter acesso as IDEs mais utilizadas ajuda muito a aprendizagem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesso gratuito a todas as IDEs profissionais da JetBrains enquanto for estudante. Inclui IntelliJ IDEA, PyCharm, WebStorm, CLion, Rider, DataGrip e outros.&lt;/li&gt;
&lt;li&gt;40% de desconto por até 2 anos após a graduação&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  MongoDB
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.mongodb.com/students" rel="noopener noreferrer"&gt;MongoDB Student Pack&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certificação MongoDB Gratuita&lt;/li&gt;
&lt;li&gt;$50 em créditos no MongoDB Atlas&lt;/li&gt;
&lt;li&gt;Trilhas de aprendizado&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Notion for Education
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.notion.com/product/notion-for-education" rel="noopener noreferrer"&gt;Notion for Students&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Workspace completo para organização pessoal e acadêmica.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plano &lt;strong&gt;Plus gratuito&lt;/strong&gt; para estudantes (workspace individual)&lt;/li&gt;
&lt;li&gt;Páginas e blocos ilimitados&lt;/li&gt;
&lt;li&gt;Upload de arquivos&lt;/li&gt;
&lt;li&gt;Mais opções de personalização e publicação de sites&lt;/li&gt;
&lt;li&gt;Histórico de versões por 30 dias&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Postman Student Expert
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.postman.com/student-program/student-expert/" rel="noopener noreferrer"&gt;Student Expert | Postman Student Program&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acesso a certificações exclusivas de API&lt;/li&gt;
&lt;li&gt;Participação na comunidade estudantil de desenvolvedores de API&lt;/li&gt;
&lt;li&gt;Eventos e workshops voltados para estudantes&lt;/li&gt;
&lt;li&gt;Oportunidade de se tornar Postman Student Leader&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Spotify Universitário
&lt;/h2&gt;

&lt;p&gt;Link: &lt;a href="https://www.spotify.com/br-pt/student/#ref=spotifycom_header_premium_student" rel="noopener noreferrer"&gt;Premium Universitário - Spotify&lt;/a&gt;&lt;br&gt;
Tá bom, esse não é lá muito tech, mas a gente pode dizer que usa pra ouvir podcast enquanto trabalha&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plano premium por R$ 12,90 mensais&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Dá pra terminar o ano com pelo menos duas certificações, um portfólio completo e muito conhecimento prático e real de tecnologia. Esses benefícios, sem dúvida, podem te ajudar a estar um passo na frente num mercado cada vez mais competitivo.&lt;br&gt;
Se gostou e clicou em pelo menos um link, não deixe de compartilhar no grupo da faculdade, com seus professores e coordenadores. Vamos fazer de tech um ambiente cada vez mais inclusivo para todos.&lt;/p&gt;

</description>
      <category>student</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Como se tornar um Microsoft Learn Student Ambassador</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Mon, 24 Jun 2024 12:28:38 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/como-se-tornar-um-microsoft-learn-student-ambassador-18af</link>
      <guid>https://dev.to/bea_tavernaro/como-se-tornar-um-microsoft-learn-student-ambassador-18af</guid>
      <description>&lt;p&gt;Desde janeiro de 2024, sou uma Estudante Embaixadora da Microsoft. Adoro títulos baseados em conquistas, e este é um que me orgulha bastante. Escrevi este artigo porque vou dar uma palestra sobre este programa para estudantes no Microsoft Reactor. Eu imaginava que começaria a palestrar bem mais adiante na carreira, mas graças ao programa, me senti encorajada a começar já e, então, surgiu o convite para tal.&lt;/p&gt;

&lt;p&gt;Usem este artigo como guia e inspiração para se tornarem parte da comunidade de estudantes empoderados pelas ferramentas da Microsoft.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o programa Microsoft Learn Student Ambassadors?
&lt;/h2&gt;

&lt;p&gt;O Microsoft Learn Student Ambassadors é uma iniciativa global da Microsoft que visa empoderar estudantes universitários apaixonados por tecnologia. O programa oferece uma plataforma para esses estudantes expandirem seus conhecimentos, desenvolverem habilidades técnicas e de liderança, e impactarem positivamente suas comunidades acadêmicas. Os participantes têm a oportunidade de colaborar em projetos, organizar eventos e workshops, e se conectar com profissionais e outros estudantes de todo o mundo.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que faz um Embaixador da Microsoft?
&lt;/h2&gt;

&lt;p&gt;Nós desempenhamos diversos papéis que ajudam a promover a aprendizagem e a adoção de tecnologias Microsoft em nossas comunidades sejam elas universidades, redes sociais ou no mercado de trabalho. As principais responsabilidades incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organização de Eventos e Workshops:&lt;/strong&gt; Embaixadores planejam e conduzem eventos educacionais, como hackathons, workshops, e meetups, para ensinar e compartilhar conhecimentos sobre tecnologias Microsoft, como Azure, Power Platform, GitHub, AI e outras.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mentoria e Tutoria:&lt;/strong&gt; Eles atuam como mentores para outros estudantes, oferecendo orientação e suporte em suas jornadas de aprendizado tecnológico. Isso pode incluir ajuda em projetos, tutoriais sobre novas ferramentas, e suporte na preparação para certificações Microsoft.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desenvolvimento de Conteúdo:&lt;/strong&gt; Embaixadores criam e compartilham conteúdo técnico, como blogs, tutoriais em vídeo, e artigos, que ajudam a educar e inspirar a comunidade. Esse conteúdo é compartilhado em plataformas como o GitHub, YouTube, e blogs pessoais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Networking e Colaboração:&lt;/strong&gt; Participar de comunidades locais e globais, conectando-se com outros embaixadores, profissionais da Microsoft, e membros da comunidade tecnológica. Isso proporciona uma rede valiosa de contatos e oportunidades de colaboração em projetos inovadores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Como se inscrever?
&lt;/h2&gt;

&lt;p&gt;Até o final de 2023, a inscrição no programa envolvia um processo seletivo que incluía o envio de um vídeo, a resposta a algumas perguntas e, finalmente, a seleção por um time interno da Microsoft. Eu faço parte da última leva de pessoas selecionadas dessa forma. &lt;/p&gt;

&lt;p&gt;Porém, a partir de janeiro deste ano, o sistema de inscrição mudou. Agora, ao invés de um modelo baseado em aplicação, adotou-se um modelo baseado em registro, alinhado à missão da Microsoft de empoderar cada pessoa e organização do planeta a atingir mais.&lt;/p&gt;

&lt;p&gt;O registro é rápido e fácil e fiz um passo a passo bem organizado para você seguir:&lt;/p&gt;

&lt;p&gt;1 - Acesse &lt;a href="http://studentambassadors.com" rel="noopener noreferrer"&gt;studentambassadors.com&lt;/a&gt; e clique em “Get Started Now”. Lembre-se de que você pode mudar a página para português apenas alterando a URL para pt-br. &lt;/p&gt;

&lt;p&gt;2 - Após se registrar, os estudantes são convidados a entrar na comunidade no Discord do Microsoft Learn Student Ambassadors (MLSA). &lt;/p&gt;

&lt;p&gt;3 - No Discord, escolha um "program path". Existem três "program paths" alinhados com os interesses de cada estudante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Influenciadores da Comunidade (&lt;em&gt;Community Influencers&lt;/em&gt;)&lt;/strong&gt;: Para pessoas que querem crescer online criando e compartilhando conteúdo da Microsoft.

&lt;ul&gt;
&lt;li&gt;Para completar é necessário: Alcançar pelo menos 250 cliques únicos nas páginas da Microsoft usando seu próprio ID.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Construtores de Comunidade (&lt;em&gt;Community Builders&lt;/em&gt;)&lt;/strong&gt;: Para aqueles que querem desenvolver habilidades de liderança criando eventos de comunidade para divulgar as ferramentas da Microsoft.

&lt;ul&gt;
&lt;li&gt;Para completar é necessário: Alcançar 1000 módulos de Cloud Skills completados usando seu próprio ID. Isso significa que, usando seu ID próprio sua rede precisa completar 1000 modulos no Cloud Skills do Microsoft Learn. Lembre-se que alguns módulos são bem simples e curtos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defensores de Startup (&lt;em&gt;Startup Advocates&lt;/em&gt;)&lt;/strong&gt;: Para aqueles que querem aumentar seu impacto promovendo soluções em IA e nuvem e a construção de startups.

&lt;ul&gt;
&lt;li&gt;Para completar é necessário: Indicar 15 inscrições aceitas para o programa Startups Founders Hub da Microsoft usando seu ID de contribuidor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4 - Complete o "Technical Onboarding" sobre IA e tecnologias de nuvem da Microsoft. No final desse onboarding você vai ter um projeto incrível para seu portfólio. No meu onboarding desenvolvi &lt;a href="https://github.com/beatavernaro/MLSAPortfolio" rel="noopener noreferrer"&gt;meu portfolio pessoal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;5 - Os membros registrados que completarem os requisitos do "program path" e o "Technical Onboarding" serão convidados a se tornarem Estudantes Embaixadores da Microsoft no nível Alpha (explico sobre os níveis já já).&lt;/p&gt;

&lt;p&gt;A minha dica maior é: Tenha paciência e trabalhe duro! Se fosse fácil qualquer um seria um embaixador. Eles buscam as pessoas mais engajadas e com muita vontade de serem lideres estudantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Níveis e Benefícios
&lt;/h2&gt;

&lt;p&gt;Os estudantes devem completar algumas atividades com o intuito de se desenvolverem e seguirem um caminho mais fácil rumo ao sucesso. Atualmente, existem três níveis: &lt;strong&gt;&lt;em&gt;Alpha, Beta e Gold.&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Vamos ver cada um deles, o que é necessário para avançar e quais os benefícios de cada etapa.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alpha&lt;/strong&gt;: Este é o nível inicial, e ao entrar nele, você conquista:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assinatura gratuita do Microsoft 365 (Office)&lt;/li&gt;
&lt;li&gt;Assinatura gratuita do Visual Studio Enterprise&lt;/li&gt;
&lt;li&gt;150 dólares de créditos mensais no Azure&lt;/li&gt;
&lt;li&gt;LinkedIn Learning&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Beta&lt;/strong&gt;: Para avançar para este nível, é necessário ser host de um evento de tecnologias da Microsoft. Você costuma ver bastante MLSA fazendo esse tipo de evento. Parece complicado mas os que já fizeram estão prontos para te dar diversas dicas. Os benefícios incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todos os benefícios do nível Alpha&lt;/li&gt;
&lt;li&gt;A famosa ‘Beta Swag Box’&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fzukmmr19gvtwlci09low.png" class="article-body-image-wrapper"&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%2Farticles%2Fzukmmr19gvtwlci09low.png" alt="Beta Swag Box do MLSA" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gold&lt;/strong&gt;: Para alcançar este nível, você precisa ser nomeado e ser embaixador por no mínimo um ano e não se formar nos próximos 6 meses. É uma conquista incrível ser Gold. Os escolhidos são anunciados duas vezes no ano em um evento global dos MLSA e se tornam lideres dentro do programa. Os benefícios incluem:

&lt;ul&gt;
&lt;li&gt;Gold Swag Box&lt;/li&gt;
&lt;li&gt;Convite para eventos e atividades especiais&lt;/li&gt;
&lt;li&gt;Consideração para ser MVP, com mentorias e nomeação&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Onde nos encontrar?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cada embaixador tem uma página exclusiva dentro do MVP communities onde pode listar os eventos e impactos realizados na comunidade. Você pode encontrar os MLSA do Brasil aqui: &lt;a href="https://mvp.microsoft.com/pt-BR/search?target=Profile&amp;amp;program=MLSA" rel="noopener noreferrer"&gt;Comunidades MVP&lt;/a&gt; é só filtrar por país. Somos apenas 38 embaixadores no Brasil. É um número pequeno comparado com outros paises da America Latina.&lt;/li&gt;
&lt;li&gt;Instagram: &lt;a href="https://www.instagram.com/mlsa.brasil/" rel="noopener noreferrer"&gt;https://www.instagram.com/mlsa.brasil/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Participar do programa Microsoft Learn Student Ambassadors tem sido uma experiência transformadora para mim. Além de expandir meus conhecimentos técnicos, desenvolvi habilidades de liderança e ganhei a confiança para compartilhar meu aprendizado com outros. A oportunidade de palestrar no Microsoft Reactor surgiu justamente por causa desse programa, o que mostra o quanto ele pode abrir portas inesperadas e acelerar o desenvolvimento profissional.&lt;/p&gt;

&lt;p&gt;Incentivo todos os estudantes a se inscreverem e se tornarem parte dessa comunidade incrível. Com o suporte e os recursos fornecidos pela Microsoft e pela própria comunidade MLSA, vocês terão a chance de fazer a diferença, não apenas em suas próprias vidas, mas também em suas comunidades. Sigam os passos descritos neste artigo, aproveitem as oportunidades oferecidas, e se tornem agentes de mudança no mundo da tecnologia.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: Este artigo será atualizado após a palestra para incluir insights e histórias de outros MLSA, além dos slides da apresentação.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>mlsa</category>
      <category>student</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Tipos de linguagens de programação</title>
      <dc:creator>Bea Tavernaro</dc:creator>
      <pubDate>Wed, 20 Mar 2024 16:55:22 +0000</pubDate>
      <link>https://dev.to/bea_tavernaro/tipos-de-linguagens-de-programacao-2f9</link>
      <guid>https://dev.to/bea_tavernaro/tipos-de-linguagens-de-programacao-2f9</guid>
      <description>&lt;p&gt;Eu comecei a escrever um artigo que, até então, achava ser simples sobre os Sistemas de Tipos no C#, mas acabei caindo em um buraco negro. Se você não é um estudante avançado de ciência da computação ou um curioso nato, talvez não conheça isso ou não se importe muito. Talvez, inclusive, saber disso não faça diferença no dia a dia, na hora de codificar algum produto (o que você acha sobre isso? Deixe nos comentários).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focrbj61evs5v7pkrd95r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focrbj61evs5v7pkrd95r.gif" alt="Alice caindo no buraco" width="498" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro da ciência da computação, existe um campo que estuda a teoria das linguagens de programação. Vale a pena dar uma lida sobre isso. Dentro dessa teoria, há uma parte que trata dos sistemas de tipagem em linguagens de programação. Parece confuso, mas vamos com calma. Se eu consegui entender, você também consegue. Na realidade, é mais simples do que parece.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Tempo de compilação x Tempo de execução&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A distinção entre uma linguagem ser fortemente tipada ou fracamente tipada está relacionada à rigidez das regras de tipo, não ao momento da verificação de tipo. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos começar, então, falando sobre tempo de execução e tempo de compilação, conceitos importantes para entender o resto do artigo.&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Farticles%2Fednfi3clouisd7fs2x9k.jpg" class="article-body-image-wrapper"&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%2Farticles%2Fednfi3clouisd7fs2x9k.jpg" alt="Tom e Jerry" width="602" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tempo de compilação
&lt;/h3&gt;

&lt;p&gt;É o período em que o código-fonte (o código que você escreveu) é traduzido para código de máquina pelo compilador. Durante o tempo de compilação, o compilador consegue verificar a &lt;em&gt;sintaxe e a semântica&lt;/em&gt; do programa e gera o código para que o programa possa ser executado. Durante esse processo, são realizadas algumas etapas como a análise léxica e sintática, a geração de um código intermediário que facilita a otimização do código para que ele seja mais eficiente e livre de erros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tempo de execução
&lt;/h3&gt;

&lt;p&gt;É simplesmente o período no qual um programa está sendo executado. Isso significa que o código gerado a partir do código-fonte é carregado na memória e as instruções são executadas pelo processador. Apesar da explicação ser "simples", várias atividades cruciais estão acontecendo nos bastidores, como a alocação de memória para as variáveis e estruturas de dados, a interação com o sistema operacional e a liberação desses recursos quando o programa é encerrado.&lt;/p&gt;

&lt;p&gt;Temos, então, linguagens estaticamente e dinamicamente tipadas. Oh, Deus!&lt;/p&gt;

&lt;h3&gt;
  
  
  Linguagem Estaticamente Tipada
&lt;/h3&gt;

&lt;p&gt;Em uma linguagem estaticamente tipada, os tipos das variáveis são verificados em tempo de compilação. Isso significa que você precisa especificar o tipo de cada variável, e o compilador verifica se as operações realizadas com essas variáveis são válidas para o tipo especificado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linguagem Dinamicamente Tipada
&lt;/h3&gt;

&lt;p&gt;Em uma linguagem dinamicamente tipada, os tipos das variáveis são verificados em tempo de execução. Isso significa que você não precisa especificar o tipo de cada variável e pode atribuir valores de diferentes tipos a uma variável ao longo do tempo.&lt;/p&gt;




&lt;p&gt;Acima, vimos sobre o momento de verificação de tipo e agora vamos falar sobre a rigidez das regras de tipo, ou seja, o que uma linguagem permite ou não:&lt;/p&gt;

&lt;h3&gt;
  
  
  Linguagem Fortemente Tipada
&lt;/h3&gt;

&lt;p&gt;É uma linguagem em que os tipos das variáveis (ou seja, se é &lt;code&gt;int&lt;/code&gt; ou &lt;code&gt;string&lt;/code&gt;, por exemplo) são rigidamente definidos, e a verificação de tipo é feita em tempo de compilação. Isso significa que ao escrever o código, você precisa definir o tipo de cada variável e não pode atribuir valores de outros tipos a essa variável. Por exemplo, você não pode realizar uma operação matemática com um número e uma string sem primeiro converter explicitamente o tipo do dado.&lt;br&gt;
O C# é uma dessas linguagens. Você não pode fazer como na primeira linha do exemplo abaixo, onde eu atribuo uma &lt;em&gt;string&lt;/em&gt; "dez" a uma variável do tipo inteiro. Você receberá um erro de compilação "&lt;em&gt;Cannot implicitly convert type 'string' to 'int'&lt;/em&gt;". Para esse tipo de linguagem, geralmente você precisará fazer uma conversão explícita, como na segunda linha do 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;int&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"dez"&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;numero&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="nf"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outras linguagens fortemente tipadas: Java, Kotlin, C++, Rust e Typescript&lt;/p&gt;

&lt;h3&gt;
  
  
  Linguagem Fracamente Tipada
&lt;/h3&gt;

&lt;p&gt;Em uma linguagem fracamente tipada, as variáveis podem assumir diferentes tipos de dados ao longo do tempo sem a necessidade de conversões explícitas. A verificação de tipo é feita em tempo de execução, o que permite que as operações sejam realizadas entre diferentes tipos de dados sem gerar erros de tipo em tempo de compilação. Isso permite uma maior flexibilidade, mas também pode levar a erros difíceis de detectar.&lt;/p&gt;

&lt;p&gt;O JavaScript é uma dessas linguagens. Pyhton e PHP também!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//1020&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, o resultado exibido no console é a concatenação da string com o número inteiro. Para realizar a soma dos dois valores, é necessário então uma conversão de tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Quando me deparo com algum problema de código, entender o tipo da linguagem e quando esse erro foi gerado me ajuda a resolver de forma mais rápida e eficiente. Por isso, gosto de estudar essas partes um pouco mais teóricas da computação. Pesquisar e fazer esse resumo me ajudou a relembrar conceitos importantes. Espero que tenha ajudado você também.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>learning</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
