Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Vamos 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 classe ServerConfig no namespace Settings que gerencia a configuração do servidor. Ela deve ter:
    • Uma propriedade somente leitura ServerName (pode ser definida apenas no construtor)
    • Uma propriedade somente leitura Port com um setter privado (definida via construtor)
    • Uma propriedade somente gravação ApiKey que armazena uma chave secreta internamente
    • Um método ValidateApiKey(string key) que retorna true se a chave fornecida corresponder à armazenada
    • Um construtor que aceita o nome do servidor e a porta
  • Program.cs: No seu arquivo principal, crie um objeto ServerConfig usando 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: True

Folha 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}
    }
}
quiz iconTeste seus conhecimentos

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