Campo e propriedade em C#: mitos, realidade e bytecode
\n\nSe 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\nEste 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\nCampo é 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\npublic class Person\n{\n public string Name; // Isto é um campo\n}\n\nSimples 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\nProblemas 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
É 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\nPropriedade é 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.
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\nQuando 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).
Propriedades automáticas (auto-implemented properties)
\nPara 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\npublic class Person\n{\n public string Name { get; set; } // Propriedade automática\n}\n\nNo 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
Diferenças principais entre campo e propriedade: tabela
\n\nPara 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