Propriedades de Apenas Leitura/Escrita
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 11 de 70.
Às vezes, você precisa de propriedades que podem ser apenas lidas ou apenas escritas. Você pode controlar isso usando private em acessores individuais.
Uma propriedade somente leitura possui um getter público, mas um setter privado (ou nenhum setter):
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}O código externo pode ler Username, mas apenas a própria classe pode modificá-lo. Isso é útil para valores que devem ser definidos uma única vez durante a construção.
Uma propriedade somente de escrita tem um setter público, mas um getter privado:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Propriedades somente de escrita são raras, mas úteis para dados sensíveis como senhas, onde você deseja aceitar entrada sem expor o valor armazenado.
Você também pode criar propriedades verdadeiramente somente leitura com apenas um getter:
public class Circle
{
public double Radius { get; }
public double Area => Math.PI * Radius * Radius;
public Circle(double radius)
{
Radius = radius;
}
}Propriedades com apenas get; só podem ser atribuídas no construtor ou na declaração, tornando-as imutáveis após a criação do objeto.
Desafio
FácilVamos construir um sistema de configuração seguro que demonstra quando usar propriedades somente leitura (read-only) e somente gravação (write-only) para proteger dados sensíveis.
Você criará dois arquivos para organizar seu código:
Config.cs: Defina uma classeServerConfigno namespaceSettingsque gerencia a configuração do servidor. Ela deve ter:- Uma propriedade somente leitura
ServerName(pode ser definida apenas no construtor) - Uma propriedade somente leitura
Portcom um setter privado (definida via construtor) - Uma propriedade somente gravação
ApiKeyque armazena uma chave secreta internamente - Um método
ValidateApiKey(string key)que retornatruese a chave fornecida corresponder à armazenada - Um construtor que aceita o nome do servidor e a porta
- Uma propriedade somente leitura
Program.cs: No seu arquivo principal, crie um objetoServerConfigusando os valores de entrada, defina a chave de API e, em seguida, valide-a contra uma chave de teste.
Você receberá quatro entradas:
- Nome do servidor
- Número da porta
- Chave de API para armazenar
- Chave de API para validar
Imprima os detalhes do servidor e o resultado da validação neste formato:
Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}Por exemplo, se as entradas forem MainServer, 8080, secret123, e secret123, a saída deve ser:
Server: MainServer, Port: 8080
API Key Valid: TrueFolha de consulta
Você pode controlar o acesso à propriedade usando private em acessores individuais.
Propriedade somente leitura com um setter privado:
public class User
{
public string Username { get; private set; }
public User(string username)
{
Username = username;
}
}O código externo pode ler Username, mas apenas a própria classe pode modificá-lo.
Propriedade somente escrita com um getter privado:
public class Account
{
public string Password { private get; set; }
public bool ValidatePassword(string input)
{
return input == Password;
}
}Útil para dados sensíveis onde você deseja aceitar entrada sem expor o valor armazenado.
Propriedade verdadeiramente somente leitura com apenas um getter:
public class Circle
{
public double Radius { get; }
public Circle(double radius)
{
Radius = radius;
}
}Propriedades com apenas get; só podem ser atribuídas no construtor ou na declaração, tornando-as imutáveis após a criação do objeto.
Experimente você mesmo
using System;
using Settings;
class Program
{
public static void Main(string[] args)
{
// Ler as entradas
string serverName = Console.ReadLine();
int port = Convert.ToInt32(Console.ReadLine());
string apiKeyToStore = Console.ReadLine();
string apiKeyToValidate = Console.ReadLine();
// TODO: Criar um objeto ServerConfig com serverName e port
// TODO: Definir a chave de API usando a propriedade write-only
// TODO: Validar a chave de API e imprimir os resultados
// Formato: Server: {ServerName}, Port: {Port}
// Chave de API Válida: {True/False}
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos