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 escribir. Puedes controlar esto usando private en accessors individuales.
Una propiedad de solo lectura tiene un captador público, pero un establecedor privado (o no tiene ningún establecedor):
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 frecuentes, pero útiles para datos confidenciales como las contraseñas, cuando quieres aceptar input sin exponer el valor stored.
También puedes crear propiedades realmente 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 que solo tienen get; solo pueden asignarse en el constructor o en la declaración, lo que las hace inmutables después de crear el objeto.
Desafío
FácilConstruyamos un sistema de configuración seguro que demuestre cuándo usar propiedades de solo lectura y solo escritura para proteger datos confidenciales.
Crearás dos archivos para organizar tu código:
Config.cs: Define una claseServerConfigen el espacio de nombresSettingsque administre 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 (se establece mediante el constructor) - Una propiedad de solo escritura
ApiKeyque almacene internamente una clave secreta - Un método
ValidateApiKey(string key)que devuelvatruesi la clave proporcionada coincide con la almacenada - Un constructor que acepte el nombre y el puerto del servidor
- Una propiedad de solo lectura
Program.cs: En tu archivo principal, crea un objetoServerConfigusando valores de entrada, establece la clave de API y, después, valídala con una clave de prueba.
Recibirás cuatro entradas:
- Nombre del servidor
- Número de puerto
- Clave de API que se almacenará
- Clave de API que se validará
Imprime los detalles del servidor y el resultado de la validación con 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: TruePrué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: Crea un objeto ServerConfig con serverName y port
// TODO: Establece la clave API usando la propiedad de solo escritura
// TODO: Valida la clave API e imprime 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 estudiantesPractica por tu cuenta: Compilador de C# online