Code Review em C#: o que verificar para que o código não adoeça

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Code Review em C#: não apenas uma formalidade, mas a salvação da produção

\n\n

Você já viu um código que funciona, mas que dá vontade de fechar os olhos? "Números mágicos", loops dentro de loops, async void e null onde não deveria estar. O code review em C# não é um procedimento burocrático, mas a última linha de defesa antes que um bug vá para produção. Ou, pior ainda, antes que seus colegas comecem a dar manutenção no código, amaldiçoando o autor.

\n\n

Neste artigo, vamos analisar no que realmente prestar atenção ao revisar código C#. Nada de enrolação — apenas casos concretos, antipadrões e exemplos. Se você é júnior, este é seu checklist. Se é sênior, refresque a memória. Vamos nessa.

\n\n

1. Null — o principal inimigo do desenvolvedor C#

\n\n

O famoso NullReferenceException é a causa de milhões de noites sem dormir. A primeira coisa que verificamos em um code review: proteção contra null.

\n\n

O que deve acender um alerta?

\n
    \n
  • Ausência de verificação de null antes de acessar propriedades.
  • \n
  • Retorno de null de métodos onde se espera uma coleção.
  • \n
  • Ignorar contextos anuláveis (#nullable enable).
  • \n
\n\n

Ruim:

\n
public string GetUserName(User user)\n{\n    return user.Name.ToUpper(); // user pode ser null!\n}
\n\n

Bom (C# 8+):

\n
public string GetUserName(User? user)\n{\n    return user?.Name?.ToUpper() ?? "Unknown";\n}
\n\n

Dica para code review: exija a ativação de Nullable em novos projetos. Não é apenas moda, isso evita erros bobos. Code review C# sem verificar nullable é como dirigir sem cinto de segurança.

\n\n

2. Assincronicidade: async/await sem armadilhas

\n\n

Programação assíncrona em C# é uma ferramenta poderosa, mas quando usada incorretamente, vira uma bomba-relógio. Na revisão, verificamos três pecados capitais.

\n\n

Pecado nº1: async void

\n

Métodos async void não podem ser rastreados — a exceção cai na thread final e mata o processo. Só é permitido para manipuladores de eventos (ex.: botões no WinForms).

\n\n

Ruim:

\n
public async void LoadDataAsync()\n{\n    var data = await _service.GetDataAsync(); // Erro mata o processo\n}
\n\n

Bom:

\n
public async Task LoadDataAsync()\n{\n    var data = await _service.GetDataAsync();\n}
\n\n

Pecado nº2: Bloqueio de código assíncrono

\n

.Result ou .Wait() em contexto assíncrono é caminho certo para deadlock.

\n\n

Ruim:

\n
var result = _service.GetDataAsync().Result; // deadlock em aplicações UI
\n\n

Bom:

\n
var result = await _service.GetDataAsync();
\n\n

Pecado nº3: Ausência de CancellationToken

\n

Operações longas devem ser canceláveis. Se na assinatura do método não há CancellationToken, pergunte ao autor: "O que acontece se o usuário fechar a aba?"

\n\n

3. LINQ: beleza ou morte lenta?

\n\n

LINQ é elegante. Mas o code review frequentemente revela que por trás da elegância se esconde O(n²) ou múltiplas iterações na coleção.

\n\n

Erros típicos ao revisar código C# com LINQ:

\n
    \n
  • Múltiplas iterações: .Count() > 0 + .First() — duas passagens. Use .Any() e .FirstOrDefault().
  • \n
  • ToList() esquecido: carregamento preguiçoso pode fazer com que a consulta ao banco seja executada depois que o contexto DataReader já foi fechado.
  • \n
  • Where + Select = redundância: se puder usar um único SelectMany, use.
  • \n
\n\n

Exemplo que deve acender uma bandeira vermelha:

\n
var result = l                

Blogs

Book Recommendations