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 possam apenas ser lidas ou apenas ser gravadas. Você pode controlar isso usando private em acessadores individuais.
Uma propriedade somente leitura tem 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;
}
}Código externo pode ler Username, mas somente 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 para 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 para escrita são raras, mas úteis para dados sensíveis, como senhas, quando você quer aceitar uma 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-se imutáveis após a criação do objeto.
Desafio
FácilVamos criar um sistema de configuração seguro que demonstra quando usar propriedades somente leitura e somente escrita para proteger dados confidenciais.
Você criará dois arquivos para organizar seu código:
Config.cs: defina uma classeServerConfigno namespaceSettingsque gerencie 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 por meio do construtor) - Uma propriedade somente escrita
ApiKeyque armazena internamente uma chave secreta - Um método
ValidateApiKey(string key)que retornatruese a chave fornecida corresponder à armazenada - Um construtor que aceita o nome e a porta do servidor
- Uma propriedade somente leitura
Program.cs: no seu arquivo principal, crie um objetoServerConfigusando valores de entrada, defina a chave da API e valide-a em relação a uma chave de teste.
Você receberá quatro entradas:
- Nome do servidor
- Número da porta
- Chave da API a ser armazenada
- Chave da API a ser validada
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 deverá ser:
Server: MainServer, Port: 8080
API Key Valid: TrueExperimente 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: Crie um objeto ServerConfig com serverName e port
// TODO: Defina a chave de API usando a propriedade somente gravação
// TODO: Valide a chave de API e imprima os resultados
// Formato: Server: {ServerName}, Port: {Port}
// API Key Valid: {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étodosPratique por conta própria: Compilador de C# online