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.
Desafío
FácilVamos 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 claseServerConfigen el espacio de nombresSettingsque 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
Portcon un setter privado (establecido a través del constructor) - Una propiedad de solo escritura
ApiKeyque almacene una clave secreta internamente - Un método
ValidateApiKey(string key)que devuelvatruesi la clave proporcionada coincide con la almacenada - Un constructor que acepte el nombre del servidor y el puerto
- Una propiedad de solo lectura
Program.cs: En tu archivo principal, crea un objetoServerConfigutilizando 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: TrueHoja 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}
}
}
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
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes