Menu
Coddy logo textTech

Propiedades de solo lectura y escritura

Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 11 de 70.

A veces necesitas propiedades que solo se puedan leer o solo se puedan escribir. Puedes controlar esto usando private en accesores individuales.

Una propiedad de solo lectura tiene un getter público pero un setter privado (o ningún setter en absoluto):

public class User
{
    public string Username { get; private set; }
    
    public User(string username)
    {
        Username = username;
    }
}

El código externo puede leer Username, pero solo la propia clase puede modificarlo. Esto es útil para valores que deben establecerse una sola vez durante la construcción.

Una propiedad de solo escritura tiene un setter público pero un getter privado:

public class Account
{
    public string Password { private get; set; }
    
    public bool ValidatePassword(string input)
    {
        return input == Password;
    }
}

Las propiedades de solo escritura son poco comunes pero útiles para datos sensibles como contraseñas, donde se desea aceptar la entrada sin exponer el valor almacenado.

También puedes crear propiedades verdaderamente de solo lectura con solo un getter:

public class Circle
{
    public double Radius { get; }
    public double Area => Math.PI * Radius * Radius;
    
    public Circle(double radius)
    {
        Radius = radius;
    }
}

Las propiedades con solo get; solo pueden asignarse en el constructor o en la declaración, lo que las hace inmutables después de la creación del objeto.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de configuración seguro que demuestre cuándo usar propiedades de solo lectura y de solo escritura para proteger datos sensibles.

Crearás dos archivos para organizar tu código:

  • Config.cs: Define una clase ServerConfig en el espacio de nombres Settings que gestione la configuración del servidor. Debe tener:
    • Una propiedad de solo lectura ServerName (solo se puede establecer en el constructor)
    • Una propiedad de solo lectura Port con un setter privado (establecido a través del constructor)
    • Una propiedad de solo escritura ApiKey que almacene una clave secreta internamente
    • Un método ValidateApiKey(string key) que devuelva true si la clave proporcionada coincide con la almacenada
    • Un constructor que acepte el nombre del servidor y el puerto
  • Program.cs: En tu archivo principal, crea un objeto ServerConfig utilizando los valores de entrada, establece la clave API y luego valídala contra una clave de prueba.

Recibirás cuatro entradas:

  • Nombre del servidor
  • Número de puerto
  • Clave API para almacenar
  • Clave API para validar

Imprime los detalles del servidor y el resultado de la validación en este formato:

Server: {ServerName}, Port: {Port}
API Key Valid: {True/False}

Por ejemplo, si las entradas son MainServer, 8080, secret123 y secret123, la salida debería ser:

Server: MainServer, Port: 8080
API Key Valid: True

Hoja de referencia

Puedes controlar el acceso a las propiedades utilizando private en los descriptores de acceso individuales.

Propiedad de solo lectura con un setter privado:

public class User
{
    public string Username { get; private set; }
    
    public User(string username)
    {
        Username = username;
    }
}

El código externo puede leer Username, pero solo la propia clase puede modificarlo.

Propiedad de solo escritura con un getter privado:

public class Account
{
    public string Password { private get; set; }
    
    public bool ValidatePassword(string input)
    {
        return input == Password;
    }
}

Útil para datos sensibles donde deseas aceptar una entrada sin exponer el valor almacenado.

Propiedad verdaderamente de solo lectura con solo un getter:

public class Circle
{
    public double Radius { get; }
    
    public Circle(double radius)
    {
        Radius = radius;
    }
}

Las propiedades con solo get; solo pueden asignarse en el constructor o en la declaración, lo que las hace inmutables después de la creación del objeto.

Pruébalo tú mismo

using System;
using Settings;

class Program
{
    public static void Main(string[] args)
    {
        // Leer entradas
        string serverName = Console.ReadLine();
        int port = Convert.ToInt32(Console.ReadLine());
        string apiKeyToStore = Console.ReadLine();
        string apiKeyToValidate = Console.ReadLine();

        // TODO: Crear un objeto ServerConfig con serverName y port

        // TODO: Establecer la clave API usando la propiedad de solo escritura

        // TODO: Validar la clave API e imprimir los resultados
        // Formato: Server: {ServerName}, Port: {Port}
        //         API Key Valid: {True/False}
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos