0Pricing
C# Academy · Aula

Encapsulamento e invariantes

Oculte o estado interno, disponibilize operações seguras e mantenha verdadeiras as invariantes da classe (por exemplo, saldo não negativo e intervalos válidos).

Encapsulamento e invariantes é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 3 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.

Visão geral do encapsulamento

Objetivo: proteger o estado do seu objeto.

  • Encapsulamento: oculte fields e exponha APIs seguras
  • Invariante: uma regra que é sempre verdadeira
  • Valide em construtores, setters e métodos

Interface somente leitura

Mantenha os fields privados. Ofereça a quem chama uma property de somente leitura e operações seguras.

using System;

// Expose read-only view; mutate via methods only
public class Counter
{
  private int _value;          // hidden state
  public int Value             // read-only to callers
  {
    get { return _value; }
    private set { _value = value; } // keep setter private
  }

  public void Increment()
  {
    Value = Value + 1;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Counter c = new Counter();
    c.Increment();
    c.Increment();
    Console.WriteLine("Value = " + c.Value);
  }
}

Validações do construtor

Os construtores definem o estado necessário. Rejeite entradas inválidas para manter os objetos válidos desde o início.

using System;

// Enforce rules early (constructor guard)
public class User
{
  public string Name { get; private set; }
  public int Age { get; private set; }

  public User(string name, int age)
  {
    if (string.IsNullOrEmpty(name)) throw new ArgumentException("name");
    if (age < 0) throw new ArgumentOutOfRangeException("age");
    Name = name;
    Age = age;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      User u = new User("Ada", 28);
      Console.WriteLine(u.Name + " (" + u.Age + ")");
    }
    catch (Exception ex)
    {
      Console.WriteLine("Error: " + ex.Message);
    }
  }
}

Invariante na prática

Defina uma invariante (por exemplo, Saldo ≥ 0) e imponha-a em setters e métodos.

using System;

// Invariant: Balance >= 0 at all times
public class BankAccount
{
  private decimal _balance;

  public decimal Balance
  {
    get { return _balance; }
    private set
    {
      if (value < 0) throw new InvalidOperationException("Balance would be negative");
      _balance = value;
    }
  }

  public BankAccount(decimal opening)
  {
    if (opening < 0) throw new ArgumentOutOfRangeException("opening");
    _balance = opening;
  }

  public void Deposit(decimal amount)
  {
    if (amount <= 0) throw new ArgumentOutOfRangeException("amount");
    Balance = Balance + amount;
  }

  public bool TryWithdraw(decimal amount)
  {
    if (amount <= 0) return false;
    if (Balance - amount < 0) return false;
    Balance = Balance - amount;
    return true;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    BankAccount a = new BankAccount(50m);
    a.Deposit(20m);
    bool ok = a.TryWithdraw(100m); // fails, invariant protected
    Console.WriteLine("ok=" + ok + " balance=" + a.Balance);
  }
}

Proteção de coleções

Não exponha diretamente listas ou matrizes internas. Retorne uma cópia (ou uma exibição somente leitura) para proteger as invariantes.

using System;
using System.Collections.Generic;

public class Tags
{
  private readonly List<string> _items = new List<string>();

  public void Add(string tag)
  {
    if (string.IsNullOrWhiteSpace(tag)) return;
    _items.Add(tag.Trim());
  }

  // Expose a copy so callers cannot mutate internal list
  public List<string> GetAllCopy()
  {
    return new List<string>(_items);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Tags t = new Tags();
    t.Add(" apple ");
    t.Add("banana");
    List<string> view = t.GetAllCopy();
    view.Add("hacker"); // modifies the copy only
    Console.WriteLine("copy count=" + view.Count);
    Console.WriteLine("original count=" + t.GetAllCopy().Count);
  }
}

Dicas de encapsulamento

Lista de verificação:

  • Fields privados; properties e métodos públicos.
  • Valide no construtor e nos setters.
  • Mantenha as invariantes verdadeiras após cada chamada.
  • Não divulgue coleções internas.

Princípio do encapsulamento

Verificação rápida: qual escolha preserva melhor o encapsulamento e uma invariante de classe?

Recapitulação

Recapitulação: encapsule usando fields privados e APIs validadas. Defina uma invariante e imponha-a em construtores, setters e métodos. Nunca divulgue coleções internas.

Perguntas Frequentes

A aula “Encapsulamento e invariantes” é grátis?

Sim — o texto completo de “Encapsulamento e invariantes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.

O que vou aprender em “Encapsulamento e invariantes”?

Oculte o estado interno, disponibilize operações seguras e mantenha verdadeiras as invariantes da classe (por exemplo, saldo não negativo e intervalos válidos). Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 3.

Quanto tempo leva a aula “Encapsulamento e invariantes”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Campos, propriedades automáticas e inicializadores de objetos
  2. Construtores e membros estáticos
  3. Encapsulamento e invariantes
← Voltar para C# Academy