Modificadores de Acesso
Os Modificadores de Acesso (Access Modifiers) são palavras-chave do C# que definem a visibilidade e o nível de acesso de tipos (classes, structs, interfaces, etc.) e de seus membros (métodos, propriedades, campos). Eles são os porteiros do seu código, determinando quem pode ver e interagir com cada parte da sua aplicação.
Dominar os modificadores de acesso é fundamental para praticar o Encapsulamento, um dos pilares da Programação Orientada a Objetos. O encapsulamento consiste em ocultar os detalhes internos de implementação de um objeto e expor apenas o que é estritamente necessário para a sua utilização. Isso protege a integridade dos dados, reduz a complexidade e facilita a manutenção e evolução do software.
Em C#, temos os seguintes modificadores de acesso:
publicprivateprotectedinternalprotected internalprivate protected
public: A Porta da Frente
O modificador public é o nível de acesso mais permissivo. Um membro public não tem nenhuma restrição de acesso. Ele pode ser acessado por qualquer código, em qualquer classe, de qualquer assembly (projeto).
Analogia do Mundo Real: A fachada de uma loja, o menu de um restaurante ou um parque público. São feitos para serem vistos e utilizados por todos.
Quando Usar: Use
publicpara os membros que definem a API pública do seu tipo. São os métodos e propriedades que outros desenvolvedores (ou outras partes do seu próprio sistema) usarão para interagir com sua classe.
Exemplo Prático: DTO e Controladores
Em uma aplicação web, as classes de Data Transfer Object (DTO) e os métodos de um Controller são quase sempre public, pois precisam ser acessados pelo framework (ASP.NET Core), por outras camadas da aplicação ou até mesmo serializados para clientes externos.
private: O Cofre Interno
O modificador private é o nível de acesso mais restritivo. Um membro private só pode ser acessado de dentro da mesma classe (ou struct) que o declara. Nem mesmo classes derivadas (filhas) podem acessá-lo.
Analogia do Mundo Real: Um diário pessoal, os pensamentos na sua cabeça ou o mecanismo interno de um relógio suíço. São detalhes íntimos, não destinados ao mundo exterior.
Quando Usar: Use
privatepara todos os membros que são detalhes de implementação. Campos que armazenam o estado interno, métodos auxiliares que realizam cálculos complexos, etc. A regra de ouro do encapsulamento é: comece comprivatee só aumente a visibilidade se for realmente necessário.
Exemplo Prático: Campo de Apoio e Método Auxiliar
protected: O Segredo de Família
O modificador protected está ligado à herança. Um membro protected pode ser acessado de dentro da mesma classe que o declara e também por qualquer classe derivada (filha), mesmo que essa classe filha esteja em outro assembly.
Analogia do Mundo Real: Uma receita de família que é passada de pais para filhos. Apenas os membros da família (classes na mesma hierarquia de herança) têm acesso a ela.
Quando Usar: Use
protectedquando você projeta uma classe base com a intenção de que ela seja estendida, e você quer fornecer às classes filhas "ganchos" ou funcionalidades auxiliares para que elas possam modificar ou estender o comportamento da base de forma controlada.
Exemplo Prático: Classe Base de Validação
internal: O Conhecimento da Empresa
O modificador internal torna um tipo ou membro acessível apenas a arquivos no mesmo assembly. Um assembly em .NET é, de forma simplificada, um projeto que é compilado em um único arquivo .dll ou .exe.
Analogia do Mundo Real: Uma ferramenta, um jargão ou um memorando interno de uma empresa. Todos os funcionários da empresa podem usar e entender, mas não é para o público externo.
Quando Usar:
internalé extremamente útil para construir aplicações modulares. Use-o para classes e métodos que contêm a lógica de negócio de um módulo, mas que não devem fazer parte da API pública que esse módulo expõe para outros projetos.
Exemplo Prático: Lógica de Cálculo Interna
Imagine que seu sistema tem um projeto Billing.dll. Dentro dele, você tem uma classe InvoiceProcessor que precisa de uma calculadora de impostos, a TaxCalculator. Essa calculadora é complexa, mas sua lógica só interessa ao projeto de faturamento.
Modificadores Combinados: protected internal e private protected
Existem dois modificadores que combinam os comportamentos de protected e internal.
protected internal: É uma união (um OU lógico). Um membroprotected internalpode ser acessado por:Qualquer código no mesmo assembly.
OU por qualquer classe derivada em outro assembly. É o mais permissivo dos dois. Útil em frameworks que precisam expor métodos para herança por consumidores externos, mas também usá-los livremente dentro do próprio framework.
private protected: É uma interseção (um E lógico). Um membroprivate protectedpode ser acessado apenas por:Classes derivadas que estão no mesmo assembly. É mais restritivo. Garante que a funcionalidade só pode ser estendida (herdada) dentro dos limites do seu próprio projeto.
Diagrama de Acessibilidade (PlantUML)
Este diagrama visualiza como os modificadores funcionam entre dois assemblies (projetos).
Tabela Resumo de Acessibilidade
Local de Acesso |
|
|
|
|
|
|
|---|---|---|---|---|---|---|
Dentro da própria classe | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
Classe derivada (mesmo assembly) | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
Classe não-derivada (mesmo assembly) | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ |
Classe derivada (outro assembly) | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
Classe não-derivada (outro assembly) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |