Rust vs C# (.NET) 2026: Qual Escolher? | Rust Brasil

C# (.NET) ou Rust em 2026? Compare performance, GC vs ownership, concorrência, ASP.NET Core vs Axum e mercado no Brasil. Saiba qual escolher e quando combinar.

Rust e C# raramente concorrem pela mesma vaga, mas aparecem cada vez mais lado a lado em decisões de arquitetura. O C#, sobre o .NET, consolidou-se como uma das plataformas mais usadas do mundo — e é onipresente no mercado brasileiro de tecnologia, de bancos a estúdios de jogos. O Rust, por sua vez, tornou-se a escolha padrão quando performance, segurança de memória e controle de baixo nível são inegociáveis, sendo a linguagem mais amada do Stack Overflow por nove anos seguidos.

Em 2026, com o .NET 10 LTS e o C# 14 maduros de um lado, e a edição 2024 do Rust estabilizada com adoção massiva em infraestrutura do outro, a pergunta prática é: qual escolher para o seu próximo projeto? Neste comparativo vamos analisar performance, gerenciamento de memória, concorrência, tipagem, curva de aprendizado, ecossistema e mercado de trabalho, com exemplos de código nas duas linguagens — incluindo o cenário brasileiro, onde C# domina o enterprise e Rust cresce em fintechs e infraestrutura. Se você está em transição de carreira, este comparativo ajuda a decidir o caminho.

Visão Geral

AspectoRustC# (.NET)
Ano de lançamento2015 (1.0)2002 (1.0), 2016 (.NET Core)
CriadorMozilla Research (hoje Rust Foundation)Microsoft (Anders Hejlsberg)
ParadigmaMulti-paradigma, sistemasMulti-paradigma, orientada a objetos
TipagemEstática, forte, inferidaEstática, forte, inferida
Gerenciamento de memóriaOwnership + Borrow CheckerGarbage Collector (.NET)
ExecuçãoNativa (LLVM, AOT)CoreCLR (JIT) + NativeAOT
Gerenciador de pacotesCargo + crates.ioNuGet
Compilador / Toolingrustc, cargo, clippyRoslyn, dotnet CLI, MSBuild
Web frameworkAxum, Actix-webASP.NET Core

Performance

A diferença de performance entre Rust e C# é estrutural, mas menor do que muitos imaginam graços aos avanços do .NET. Rust compila para código de máquina nativo via LLVM, sem runtime de coleta de lixo. O C# no .NET compila para IL (Intermediate Language) que a CoreCLR compila para nativo (JIT) conforme o código “esquenta” — e, desde o .NET 7/8, também oferece NativeAOT, que gera binários nativos antecipadamente, reduzindo o cold start e o tamanho da imagem.

A diferença prática: Rust entrega latência previsível (sem pausas de GC) e menor consumo de memória em qualquer carga. O C# atinge performance excelente em serviços de longa duração após aquecimento, mas paga custo de warmup, pausas de GC e footprint maior. O NativeAOT aproxima o .NET do nativo no startup, mas o GC continua presente — ele não elimina o managed runtime.

Benchmark: Ordenação de um milhão de números

Rust:

use std::time::Instant;
use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    let mut numeros: Vec<i64> = (0..1_000_000)
        .map(|_| rng.gen_range(0..1_000_000))
        .collect();

    let inicio = Instant::now();
    numeros.sort_unstable();
    let duracao = inicio.elapsed();

    println!("Tempo de ordenação: {:?}", duracao);
}

C# (.NET 10):

using System.Diagnostics;

Random rnd = new();
long[] numeros = Enumerable.Range(0, 1_000_000)
    .Select(_ => rnd.NextInt64(1_000_000))
    .ToArray();

var sw = Stopwatch.StartNew();
Array.Sort(numeros);
sw.Stop();

Console.WriteLine($"Tempo de ordenação: {sw.Elapsed}");

Em ordenação pura em memória, as duas ficam próximas (ordem de poucas dezenas de milissegundos), porque o gargalo é a memória, não a linguagem. A vantagem do Rust aparece em sistemas que ficam muito tempo no ar, em baixa latência e em workloads com muita alocação — onde o GC do .NET introduz variância e pausas que o Rust simplesmente não tem.

Gerenciamento de Memória

Aqui está a diferença filosófica mais profunda entre as duas linguagens.

C# usa um garbage collector geracional: você aloca objetos livremente no heap gerenciado e o runtime reclama a memória quando ela não é mais referenciada. É ergonômico e produtivo, mas introduz pausas, variância de latência e maior consumo de memória. Para hot paths, o .NET oferece value types (struct), Span<T>, stackalloc e memória não gerenciada — mas a disciplina fica por conta do desenvolvedor.

Rust usa ownership e borrowing: a memória é gerida em tempo de compilação, sem GC. Cada valor tem um dono; quando o dono sai de escopo, a memória é liberada de forma determinística (Drop). O borrow checker garante, em compilação, que não haja data races nem use-after-free. O custo é uma curva de aprendizado mais íngreme; o benefício é performance previsível e segurança de memória sem runtime.

Em síntese: o .NET troca um pouco de performance e previsibilidade por produtividade; o Rust troca produtividade inicial por controle total e zero custo de abstração.

Modelos de Concorrência

As duas linguagens têm async/await, mas com runtimes diferentes.

C# traz async/await nativo com Task e ValueTask, a Task Parallel Library (TPL), Parallel.For para paralelismo de dados e System.Threading.Channels para comunicação entre produtores e consumidores. É um modelo maduro e integrado ao runtime — não há escolha de executor.

Rust tem async/await na linguagem, mas o runtime fica fora: você escolhe Tokio (o padrão de fato), async-std ou roda sem executor. Para paralelismo de dados, Rayon transforma um iterador em paralelo com uma palavra (par_iter()). Canais vêm de crossbeam ou do próprio Tokio. A flexibilidade é maior; a configuração inicial, também.

Exemplo de paralelismo de dados:

use rayon::prelude::*;

fn main() {
    let numeros: Vec<u64> = (1..=1_000_000).collect();
    let soma: u64 = numeros.par_iter().map(|&n| n * n).sum();
    println!("Soma dos quadrados: {soma}");
}

Tipagem: Traits vs Interfaces e Genéricos

Ambas têm tipagem estática forte, mas com diferenças importantes.

Generics: o C# usa generics reificados — a informação de tipo existe em tempo de execução, o que é ergonômico, mas paga custo de runtime. O Rust monomorfiza os genéricos em compilação (cada tipo concreto gera código especializado), entregando zero-cost abstractions.

Abstração: interfaces e classes abstratas do C# (com herança e métodos virtuais) correspondem, em espírito, aos traits do Rust — mas traits são mais flexíveis (podem ser adicionados a tipos externos) e resolvidos em compilação (estático) ou via trait objects (dinâmico, com vtable).

Nulos e erros: o C# tem nullable reference types (NRTs, desde o C# 8) e tratamento por exceções. O Rust modela ausência com Option<T> e falhas com Result<T, E> + o operador ?, forçando o tratamento explícito de erros em compilação — sem o custo de stack unwinding de exceções.

Curva de Aprendizado

O C# é mais acessível no início: sintaxe derivada da família C (familiar a quem vem de Java/JavaScript), GC que cuida da memória, mensagens de erro do Roslyn cada vez melhores e ferramentas como Visual Studio e Rider que turbinam a produtividade. Em poucas semanas, um dev entrega features.

O Rust exige dominar ownership, lifetimes e o borrow checker — conceitos ausentes na maioria das linguagens. A curva até a produtividade costuma ficar entre 3 e 6 meses. A compensação: o compilador do Rust é famoso pelas mensagens de erro didáticas e por “ensinar” boas práticas de concorrência e memória, o que melhora até o seu código em outras linguagens.

Ecossistema e Ferramentas

RecursoRustC# (.NET)
Build / CLIcargodotnet CLI, MSBuild
Pacotescrates.ioNuGet
Formatadorrustfmtdotnet format
LinterclippyRoslyn analyzers
DocsrustdocDocFX / XML docs
IDErust-analyzer (VS Code, Fleet)Visual Studio, Rider, VS Code
WebAxum, Actix-webASP.NET Core (Minimal APIs, MVC, Blazor)

O Cargo é frequentemente citado como o melhor gerenciador de pacotes da indústria — dependências, build, testes e docs em um comando só. O ecossistema .NET é mais antigo e amplo em enterprise (segurança, persistência com Entity Framework, mensageria, observabilidade), com suporte oficial da Microsoft eSLA corporativo.

Mercado de Trabalho no Brasil em 2026

O C#/.NET é gigantesco no Brasil. Bancos (como o Bradesco), seguradoras, órgãos públicos, grandes fábricas de software e consultorias (a Act Digital e a Accenture, por exemplo) rodam vastos volumes de código .NET. Há também o mundo de games: Unity (C#) domina o mercado de jogos mobile/casual, e Godot ganhou um forte binding em C#. O volume absoluto de vagas é enorme e estável.

O Rust cresce rápido em fintechs e infraestrutura: Nubank, Mercado Livre, iFood, Stone, PicPay, PagBank, BTG Pactual e XP Inc. adotam Rust em componentes críticos. O número absoluto de posições é menor, mas o salário por vaga costuma ser mais alto e há forte demanda por trabalho remoto internacional. Veja o panorama de carreira em Rust e as faixas de remuneração em nosso guia salarial.

Casos de Uso Ideais

Escolha C# (.NET) quando:

  • Você constrói APIs e sistemas corporativos (ERP, CRM, back-office) com ASP.NET Core.
  • Precisa do ecossistema enterprise maduro: Entity Framework, mensageria, observabilidade, suporte oficial.
  • O projeto é um jogo em Unity ou Godot (C#).
  • A equipe já domina .NET e a produtividade é o fator decisivo.

Escolha Rust quando:

  • O gargalo é performance, latência previsível, consumo de memória ou cold start.
  • Você constrói CLI, ferramentas de infraestrutura, data plane, parsers ou WebAssembly de alta performance.
  • Precisa de segurança de memória em sistemas sem abrir mão de controle de baixo nível.
  • O componente roda em servidores por longos períodos e pausas de GC são inaceitáveis.

Exemplo Completo: Servidor HTTP

Vamos comparar um endpoint JSON simples nas duas linguagens.

Rust (com Axum):

use axum::{routing::get, Json, Router};
use serde::Serialize;

#[derive(Serialize)]
struct Mensagem {
    texto: String,
    timestamp: u64,
}

async fn hello() -> Json<Mensagem> {
    Json(Mensagem {
        texto: "Olá do Rust!".into(),
        timestamp: 1751548800,
    })
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/api/hello", get(hello));
    let listener = tokio::net::TcpListener::bind("127.0.0.1:8080")
        .await
        .unwrap();
    println!("Servidor rodando em http://localhost:8080");
    axum::serve(listener, app).await.unwrap();
}

C# (ASP.NET Core Minimal API):

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/api/hello", () => new
{
    Texto = "Olá do C#!",
    Timestamp = 1751548800L
});

app.Run();

Note como o ASP.NET Core entrega um servidor completo com pouquíssimas linhas e um ecossistema enorme (autenticação, Entity Framework, health checks, openapi nativo). Axum exige declarar dependências no Cargo.toml, mas entrega um binário nativo, leve e sem runtime de GC — ideal para contêineres pequenos e edge.

Conclusão

Não existe resposta universal para “Rust ou C#” — e em 2026 a melhor resposta costuma ser usar as duas.

  • Escolha C#/.NET quando o valor estiver em produtividade corporativa, ecossistema enterprise maduro, integrações, games e na enorme disponibilidade de talento no mercado brasileiro. É a aposta segura para o core da maioria das empresas.
  • Escolha Rust quando o gargalo for performance, latência previsível, consumo de memória, cold start ou segurança de memória em sistemas. É onde Rust já é padrão e paga o investimento na curva de aprendizado.

O padrão mais comum em empresas modernas é a coexistência: C# no core corporativo e Rust nos componentes críticos — gateways, motores de regras, data plane e ferramentas de infraestrutura. Para quem já programa em C#, aprender Rust é um diferencial que abre portas em projetos de alto impacto, e a instalação leva poucos minutos.

Aproveite para explorar outras comparações relevantes para devs brasileiros: Rust vs Java, Rust vs Go, Rust vs C++ e Rust vs Python. As duas linguagens representam caminhos sólidos e bem pagos — o importante é escolher com clareza do problema que você quer resolver.


Você já programa em C# e está considerando Rust (ou vice-versa)? Conte nos comentários qual linguagem prefere e por quê!