Executando verificação de segurança...
8

Explorando a Anatomia das Classes em C#: Entendendo Campos, Propriedades, Membros e Atributos

Provavelmente se tu programa em C# já ouviu os termos "campos, propiedades, membros, atributos..." e se perguntou: "Qual é a diferença entre campos, propriedades e atributos?". E é exatamente sobre isso que eu quero falar. Dominar esses conceitos é fundamental. Então bora explorar cada um deles pra que tu possa entender o que eles são.

Campos (Fields)

Os campos são variáveis declaradas diretamente dentro de uma classe. Eles representam o estado interno da classe, armazenando dados que podem ser acessados diretamente. Um campo pode ser declarado com qualquer modificador de acesso (public, private, protected), determinando sua visibilidade para outras partes do código.

  • Os campos são variáveis declaradas diretamente na classe.
  • Eles representam o estado interno da classe e geralmente são acessados diretamente.
  • Os campos podem ser públicos, privados ou protegidos, determinando sua visibilidade para outras partes do código.

Exemplo

public class Pessoa
{
    public string nome;
    private int idade;
}

Propriedades (Properties)

Imagine as propriedades como os guardiões desses campos. Elas fornecem uma camada de abstração sobre os campos, controlando como eles são acessados e modificados. Quando você define uma propriedade em uma classe, está essencialmente criando um ponto de acesso para os dados armazenados nos campos dessa classe (também conhecidos como: "getters" e "setters") que permitem ler e modificar o valor do campo associado.

E o que é ainda mais interessante é que as propriedades podem fazer muito mais do que apenas devolver ou definir valores. Elas podem acionar eventos, chamar métodos, fazer cálculos complexos e muito mais.

  • As propriedades são uma forma de encapsular campos e controlar o acesso a eles.
  • Elas têm métodos acessores especiais chamados "getters" e "setters", que permitem ler e modificar o valor do campo associado.

Exemplo

public class Pessoa
{
    private string nome;
    
    public string Nome
    {
        get { return nome; }
        set { nome = value; } // "value" é o valor que está sendo atribuído à propriedade
    }
}

Membros (Members)

Essa vai ser breve!: Em C#, um "membro" é basicamente qualquer elemento dentro de uma classe que contribui para sua estrutura, comportamento ou funcionalidade. Isso pode incluir campos, propriedades, métodos, construtores, eventos e até mesmo uma classe dentro da classe (nested types).

Atributos (Attributes)

Com certeza, os atributos em C# têm uma semelhança notável com os decoradores encontrados em outras linguagens. Vamos aprofundar um pouco mais sobre os atributos:

Em C#, os atributos são metadados que fornecem informações adicionais sobre tipos, membros ou outros elementos do código. Eles são usados para adicionar informações especiais para o compilador ou para outros componentes de software. Os atributos são definidos com uma sintaxe especial e podem ser aplicados a uma variedade de elementos do código.

Eles oferecem uma maneira poderosa de adicionar contexto e comportamento adicional ao seu código. Por exemplo, ao usar o atributo [Serializable], você está indicando ao compilador que a classe pode ser serializada. Da mesma forma, o atributo [Obsolete] pode alertar outros desenvolvedores de que um método está obsoleto e deve ser substituído.

Os atributos em C# são muito mais do que simples metadados. Ao entender como usar e criar atributos de forma proveitosa, você pode adicionar uma camada extra de flexibilidade, reutilização e muito mais.

Exemplo:

[Serializable]
public class Pessoa
{
    // propriedades e campos aqui
}

//

[HttpGet]
public async Task<IActionResult> GetAllProductsAsync([FromServices] IRepository<Product> repository)
{
	IEnumerable<Product> products = await _repository.GetAllAsync();
	return Ok(products);
}

Espero que este post tenha iluminado seu entendimento sobre campos, propriedades, membros e atributos :D até!

5

Complementando, existe outra forma de declarar propriedades que caem neste caso mais "comum" (o getter só retorna e o setter só recebe o valor). Basta usar a sintaxe de Auto-implemented properties.

E neste caso, para criar o objeto, use um object initializer:

public class Pessoa
{
    // Auto-implemented properties
    public string Nome { get; set; }
    public int Idade { get; set; }
}

// object initializer
var pessoa = new Pessoa { Nome = "Fulano de tal", Idade = 42 };
Console.WriteLine($"{pessoa.Nome} tem {pessoa.Idade} anos");

Lembrando que para usar object initializer, a classe precisa ter o construtor sem parâmetros.


Ou então vc cria o construtor, aí pode inicializar do jeito mais "tradicional":

public class Pessoa
{
    public string Nome { get; set; }
    public int Idade { get; set; }

    public Pessoa(string nome, int idade)
    {
        this.Nome = nome;
        this.Idade = idade;
    }
}

// usa o construtor em vez de object initializer
var pessoa = new Pessoa("Fulano de tal", 42);
Console.WriteLine($"{pessoa.Nome} tem {pessoa.Idade} anos");