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 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.

challenge icon

Desafio

Fácil

Vamos 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 classe ServerConfig no namespace Settings que gerencie 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 por meio do construtor)
    • Uma propriedade somente escrita ApiKey que armazena internamente uma chave secreta
    • Um método ValidateApiKey(string key) que retorna true se a chave fornecida corresponder à armazenada
    • Um construtor que aceita o nome e a porta do servidor
  • Program.cs: no seu arquivo principal, crie um objeto ServerConfig usando 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: True

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: 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}
    }
}
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

Pratique por conta própria: Compilador de C# online