Campos e propriedades em C#: qual a diferença e o que está por baixo dos panos?

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

Campo e propriedade em C#: mitos, realidade e bytecode

\n\n

Se você já se perguntou "What is the difference between a field and a property?" em C#, você não está sozinho. Esta é uma das perguntas mais populares no Stack Overflow com milhares de visualizações. Para um iniciante, a diferença parece confusa: ambos armazenam dados. Mas por baixo dos panos — são dois mecanismos completamente diferentes. Vamos entender de uma vez por todas por que property não é apenas um "campo com getter", mas uma ferramenta poderosa de encapsulamento e contrato.

\n\n

Este artigo não é documentação seca. É uma análise prática com exemplos que você pode executar agora mesmo. Aperte os cintos, vai ser interessante.

\n\n
\n\n

O que é um campo (field) em C#?

\n\n

Campo é uma variável declarada diretamente dentro de uma classe ou estrutura. Ele armazena dados e não possui lógica adicional ao ser lido ou escrito. O campo é um armazenamento "bruto".

\n\n
public class Person\n{\n    public string Name; // Isto é um campo\n}
\n\n

Simples assim. Mas há um detalhe: se o campo for público, você perde o controle sobre como ele é acessado. Qualquer código externo pode gravar qualquer coisa nele, e você não conseguirá reagir a isso (por exemplo, verificar o comprimento da string ou disparar um evento).

\n\n

Problemas dos campos públicos

\n
    \n
  • Não há controle sobre validação.
  • \n
  • Não é possível alterar o comportamento de leitura/escrita sem alterar a API da classe.
  • \n
  • Mais difícil manter a compatibilidade reversa.
  • \n
\n\n

É por isso que, em uma boa POO, campos públicos são quase sempre um antipadrão. Em C#, para isso, foram criadas as propriedades.

\n\n
\n\n

O que é uma propriedade (property) em C#?

\n\n

Propriedade é um membro da classe que se parece com um campo, mas na verdade é um par de métodos (acessadores): get e set. Esta é a resposta principal para a pergunta "What is the difference between a field and a property?". Propriedade é um açúcar sintático, por trás do qual estão métodos comuns.

\n\n
public class Person\n{\n    private string _name; // Campo privado — campo de suporte\n\n    public string Name // Propriedade\n    {\n        get { return _name; }\n        set { _name = value; }\n    }\n}
\n\n

Quando você escreve person.Name = "Alice", o compilador C# converte isso em uma chamada ao método set_Name("Alice"). E ao ler — em uma chamada a get_Name(). Você não vê isso, mas acontece no nível do código IL (linguagem intermediária do .NET).

\n\n

Propriedades automáticas (auto-implemented properties)

\n

Para simplificar, no C# 3.0 surgiram as propriedades automáticas. O compilador cria sozinho um campo de suporte privado. O código fica mais curto, e a funcionalidade é a mesma.

\n\n
public class Person\n{\n    public string Name { get; set; } // Propriedade automática\n}
\n\n

No nível IL, isso ainda se transforma nos métodos get_Name e set_Name com um campo privado. Nenhuma mágica — apenas conveniência.

\n\n
\n\n

Diferenças principais entre campo e propriedade: tabela

\n\n

Para fixar, aqui está uma comparação visual. Isso ajudará você a responder rapidamente à pergunta "field vs property C#" em uma entrevista ou em um projeto real.

\n\n
    \n
  • Encapsulamento: Campo — apenas uma variável. Propriedade — métodos de acesso que podem conter lógica.
  • \n
  • Validação: Na propriedade, é possível adicionar verificação no setter. No campo — não.
  • \n
  • Notificações: Na propriedade, é fácil disparar um evento (por exemplo, INotifyPropertyChanged). No campo — será necessário refatorar.
  • \n
  • Virtualidade: Propriedades podem ser virtuais, abstratas, sobrescritas. Campos — não.
  • \n
  • Trabalho com threads: Na propriedade, é possível adicionar bloqueio (lock). No campo — apenas através de meios externos.
  • \n
  • Serialização: Serializadores frequentemente trabalham com propriedades, e não com campos (especialmente se por

Blogs

Book Recommendations