Módulo 1 · C# — Capítulo 01

Introdução ao C# e .NET

De onde vem o C#, o que é o .NET, e por que "compilar" muda a forma como você pensa sobre o código — vindo de quem já vive JavaScript há anos.

1. O que é C# e por que ele existe

C# (lê-se "C sharp") nasceu em 2000, criado pela Microsoft sob a liderança de Anders Hejlsberg — o mesmo arquiteto por trás do Turbo Pascal, Delphi e, mais tarde, do TypeScript (sim, o mesmo TypeScript que você provavelmente já usou em cima do Node.js). Isso não é coincidência: dá pra sentir a "mão" dele tanto em C# quanto em TypeScript — os dois têm obsessão por tipos bem definidos e ferramentas de desenvolvimento de primeira classe.

A linguagem foi desenhada junto com uma plataforma chamada .NET. Isso é uma diferença estrutural importante em relação ao que você conhece do mundo JavaScript: Node.js é um runtime que você escolhe usar para rodar JS fora do browser, mas JavaScript como linguagem existe independente dele. C# e .NET, por outro lado, nasceram juntos e foram feitos um para o outro desde o primeiro dia.

Nota

Hoje o C# é padronizado pela ECMA/ISO e o .NET é open source e multiplataforma (Windows, Linux, macOS) desde a unificação no .NET 5 (2020), que encerrou a era em que existiam ".NET Framework" (só Windows) e ".NET Core" (multiplataforma) como coisas separadas.

2. Entendendo o ecossistema .NET

Para quem vem do Node.js, vale mapear as peças que você já conhece para as peças equivalentes do mundo .NET:

Node.js / JavaScript.NET / C#Papel
node (runtime)CLR (Common Language Runtime)Executa o código já "traduzido"
V8 EngineCLR + JIT CompilerTransforma código em instruções de máquina
npmNuGetGerenciador de pacotes
package.json.csprojManifesto do projeto e dependências
API padrão do Node (fs, http...)BCL (Base Class Library)Biblioteca padrão da linguagem
dotnet CLIdotnet CLIFerramenta de linha de comando (mesmo nome!)

A diferença mais importante, porém, é como o código chega até virar instruções que o processador entende. É isso que o diagrama abaixo mostra.

Program.cs código-fonte C# Compilador Roslyn análise + checagem de tipos app.dll (IL) bytecode intermediário CLR JIT compila IL → código de máquina na hora da execução tempo de compilação (build) tempo de execução (runtime)

Fig. 1 — Do código-fonte ao processador: compilação (Roslyn) gera IL, e o CLR faz o JIT (Just-In-Time) na hora de rodar.

Comparando com o que você já sabe

O V8 (motor do Node.js) também faz JIT — ele não interpreta puramente, ele compila JS "quente" para código de máquina em tempo real. A diferença é que em JS não existe uma etapa de compilação separada e obrigatória antes de rodar: você escreve e roda. Em C#, o compilador Roslyn precisa rodar antes e vai reclamar imediatamente se houver erro de tipo — o erro aparece no build, não em produção às 3h da manhã.

3. Instalando e criando o primeiro projeto

Assim como você usa npm init para começar um projeto Node, o .NET tem o dotnet new:

bash terminal
dotnet new console -o MeuPrimeiroApp
cd MeuPrimeiroApp
dotnet run

Isso cria uma pasta com dois arquivos principais: Program.cs (seu código) e MeuPrimeiroApp.csproj (o manifesto do projeto, equivalente ao package.json).

C# Program.cs
// C# moderno (top-level statements, C# 9+)
Console.WriteLine("Olá, mundo!");

var nome = "Wellington";
Console.WriteLine($"Bem-vindo, {nome}!");
JS index.js
// Node.js, pra comparar
console.log("Olá, mundo!");

const nome = "Wellington";
console.log(`Bem-vindo, ${nome}!`);

Repare como são parecidos na superfície — string interpolation com $"..." é o primo direto do template literal `...` do JS. A diferença de fundo é que var nome em C# não significa "tipo dinâmico": o compilador infere que nome é do tipo string e isso fica travado para sempre — tentar fazer nome = 5; depois vira erro de compilação, não um bug silencioso em produção.

4. Anatomia de um programa C#

Antes do C# 9, todo programa precisava de uma estrutura explícita com namespace, classe e um método Main. Hoje isso ainda existe por baixo dos panos — o "top-level statements" que você viu acima é açúcar sintático para a mesma coisa:

C# Program.cs — forma completa (explícita)
using System;

namespace MeuPrimeiroApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Olá, mundo!");
        }
    }
}
namespace MeuPrimeiroApp class Program static void Main(string[] args) { ... ponto de entrada do programa ... } ≈ equivalente ao topo do seu index.js: o primeiro código que roda quando o app inicia.

Fig. 2 — Todo namespace agrupa classes; toda classe executável tem um método Main como ponto de entrada.

Conceito C#Para que serveEquivalente mental em JS
using System;Importa um namespace para usar sem prefixorequire / import
namespaceAgrupa classes relacionadas, evita conflito de nomespastas + módulos ES
class ProgramTudo em C# vive dentro de uma classe (ou struct)não existe equivalente direto — JS permite funções soltas
static void MainPonto de entrada que o CLR chama primeirotopo do arquivo de entrada
Atenção

Diferente do JavaScript, em C# não existem funções soltas no nível mais alto (fora de top-level statements). Todo método vive dentro de uma classe, struct ou record. Isso vai parecer burocrático no início vindo do Node, mas é a base do porquê C# empurra tão fortemente para orientação a objetos — assunto dos capítulos 5 e 6.

5. Tipagem estática: a mudança de hábito mais importante

Se tem uma coisa que vai exigir reprogramar reflexos vindos do JS, é essa: em C#, o tipo de cada variável é decidido e verificado durante a compilação, não durante a execução. Isso muda completamente onde e quando você descobre um erro.

JS tipagem dinâmica
let idade = 30;
idade = "trinta"; // válido em JS
idade = idade + 1; // NaN — só descobre rodando
C# tipagem estática
int idade = 30;
idade = "trinta"; // ERRO DE COMPILAÇÃO
// CS0029: não é possível converter
// 'string' para 'int'

Pense assim, usando sua base de Matemática: em JavaScript, o "domínio" de uma variável é implícito e pode mudar a qualquer momento durante a "função" (o programa rodando). Em C#, você declara o domínio antecipadamente e o compilador prova, antes mesmo de rodar, que nenhuma operação sai desse domínio. É mais perto de uma prova formal do que de uma execução de teste por tentativa.

6. Onde isso te leva

Com C# você troca flexibilidade imediata por garantias antecipadas. O ganho fica mais claro em projetos grandes e de longa duração — exatamente o cenário mais comum em sistemas corporativos com SQL Server por trás, que é onde este curso está mirando. Nos próximos capítulos do Módulo 1 vamos construir a linguagem peça por peça: tipos e operadores, estruturas de controle, e então orientação a objetos a fundo.

📌 Resumo do capítulo

  • C# e .NET nasceram juntos em 2000, sob liderança de Anders Hejlsberg (mesmo arquiteto do TypeScript).
  • Hoje o .NET é open source e multiplataforma (Windows/Linux/macOS) desde o .NET 5.
  • Pipeline de execução: código-fonte → Roslyn compila para IL → CLR faz JIT → código de máquina.
  • Diferente do Node.js, C# tem uma etapa de compilação obrigatória que verifica tipos antes de rodar.
  • dotnet new console, dotnet run e o .csproj são os equivalentes do npm init, node index.js e do package.json.
  • Todo código em C# vive dentro de uma classe; não existem funções soltas como em JS.
  • Tipagem estática = erros de tipo aparecem no build, não em produção.

✏️ Praticando

  1. Instale o SDK do .NET (dotnet --version para confirmar) e crie um projeto console novo.
  2. Reescreva o "Hello World" usando a forma explícita (namespace + class + Main), sem top-level statements.
  3. Force de propósito o erro CS0029 do exemplo da seção 5 e leia a mensagem completa que o compilador devolve no terminal.
  4. Compare mentalmente: quais dos seus reflexos automáticos em JavaScript (reatribuir variáveis com tipos diferentes, por exemplo) você vai precisar "desaprender"?