Inicialização de propriedades automáticas em C#: TOP 5 erros e masterclass

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

Introdução: por que a questão sobre propriedades automáticas reuniu milhares de visualizações?

\n\n

Se você já programou em C#, certamente já se deparou com uma questão simples, mas importante: "Como definir corretamente o valor inicial de uma propriedade automática?". Esta pergunta no Stack Overflow reuniu dezenas de milhares de visualizações, e não é à toa. A aparente simplicidade esconde várias armadilhas.

\n\n

Imagine: você cria a classe User e deseja que a propriedade Name não seja null por padrão, mas sim uma string vazia. Parece simples, certo? Mas na prática, os desenvolvedores cometem erros típicos de inicialização de propriedades C# que levam a NullReferenceException ou comportamentos inesperados.

\n\n

Neste artigo, analisaremos o TOP 5 erros e mostraremos como evitá-los. Você aprenderá abordagens modernas — do C# 6 ao C# 12 — e entenderá qual método escolher para seu projeto.

\n\n
\n\n

Erro nº1: Ignorar a inicialização de propriedades automáticas

\n\n

O erro mais comum é não definir um valor inicial para tipos de referência. Muitos iniciantes escrevem:

\n\n
public class User\n{\n    public string Name { get; set; } // null por padrão\n    public List<string> Roles { get; set; } // null\n}
\n\n

Em C#, propriedades automáticas para tipos de referência são null por padrão. Isso leva a problemas com NullReferenceException quando você esquece de atribuir um valor antes de usar.

\n\n

Como corrigir?

\n

Sempre defina explicitamente um inicializador de propriedade automática C#. A maneira mais simples é usar a sintaxe do C# 6:

\n\n
public class User\n{\n    public string Name { get; set; } = string.Empty;\n    public List<string> Roles { get; set; } = new List<string>();\n}
\n\n
\n

Dica: Use string.Empty em vez de aspas vazias — isso melhora a legibilidade e segue as melhores práticas C#.

\n
\n\n
\n\n

Erro nº2: Inicialização no construtor sem considerar a cadeia de chamadas

\n\n

Outro erro comum é definir o valor padrão C# apenas no construtor, ignorando os inicializadores de propriedade. Isso pode causar confusão, especialmente com herança.

\n\n
public class BaseClass\n{\n    public int Value { get; set; }\n\n    public BaseClass()\n    {\n        Value = 10;\n    }\n}\n\npublic class DerivedClass : BaseClass\n{\n    public DerivedClass()\n    {\n        // Value já = 10, mas podemos sobrescrever\n    }\n}
\n\n

Problema: se você adicionar um inicializador à propriedade Value e mantiver a atribuição no construtor, a ordem de execução pode surpreender. Os inicializadores são executados antes do corpo do construtor da classe base, mas após a chamada do construtor da classe derivada.

\n\n

Como evitar?

\n

Escolha um método: ou inicializador ou construtor. É melhor preferir inicializadores de propriedades automáticas C#, pois são mais previsíveis e concisos.

\n\n
public class BaseClass\n{\n    public int Value { get; set; } = 10; // Fonte única de verdade\n}
\n\n
\n\n

Erro nº3: Uso de campos readonly em vez de propriedades automáticas

\n\n

Alguns desenvolvedores, ao tentar definir um valor inicial, abandonam as propriedades automáticas e usam campos públicos:

\n\n
public class Config\n{\n    public readonly int MaxRetries = 3; // Erro: violação de encapsulamento\n}
\n\n

Isso é uma má prática. Campos violam o encapsulamento — você não conseguirá adicionar lógica no getter/setter sem alterar a API. Além disso, ao serializar ou usar em WPF/Blazor, isso criará problemas.

\n\n

Abordagem correta

\n

Use propriedades automáticas com inicialização ou propriedades init-only do C# 9:<

Blogs

Book Recommendations