Palabras clave 'readonly' y 'const'
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 16 de 70.
C# proporciona dos palabras clave para crear valores que no pueden cambiar: const y readonly. Aunque ambas impiden la modificación, funcionan de manera diferente y sirven para propósitos distintos.
Un campo const debe ser asignado en la declaración y su valor se determina en tiempo de compilación. Es implícitamente estático, lo que significa que pertenece a la clase en lugar de a las instancias:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}Accedes a las constantes a través del nombre de la clase: GameSettings.MaxPlayers. Las constantes funcionan solo con tipos primitivos, cadenas y null porque el compilador debe conocer el valor exacto.
Un campo readonly puede ser asignado en la declaración o en un constructor, y su valor se determina en tiempo de ejecución:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}A diferencia de const, los campos readonly pueden contener cualquier tipo y pueden tener valores diferentes por instancia. Una vez que el constructor termina, el valor no puede cambiar.
Usa const para valores que son verdaderamente universales y nunca cambiarán, como las constantes matemáticas. Usa readonly para valores que deben establecerse una vez pero que podrían variar entre objetos o necesitar un cálculo en tiempo de ejecución.
Desafío
FácilVamos a construir un sistema de configuración de simulación física que demuestre cuándo usar const para constantes universales frente a readonly para valores que se establecen una vez en tiempo de ejecución.
Crearás dos archivos para organizar tu código:
PhysicsConstants.cs: Define una clasePhysicsConstantsen el espacio de nombresSimulation. Esta clase debe contener constantes universales que nunca cambian y son las mismas en todas partes:- Un campo
constGravityestablecido en9.81 - Un campo
constSpeedOfLightestablecido en299792458 - Un campo
constde tipo stringGravityUnitestablecido en"m/s^2"
- Un campo
Projectile.cs: Define una claseProjectileen el espacio de nombresSimulation. Cada proyectil tiene valores que deben establecerse una vez al crearse y nunca modificarse después:- Un campo
readonlyName(string) - Un campo
readonlyInitialVelocity(double) - Un campo
readonlyLaunchAngle(double, en grados) - Un constructor que acepte y establezca los tres valores
- Un método
GetMaxHeight()que calcule la altura máxima usando la fórmula:(velocity^2 * sin^2(angle)) / (2 * gravity). UsaMath.Sin()y convierte los grados a radianes multiplicando porMath.PI / 180
- Un campo
Program.cs: En tu archivo principal, crea un proyectil utilizando los valores de entrada y muestra las constantes físicas junto con la altura máxima calculada del proyectil.
Recibirás tres entradas:
- Nombre del proyectil
- Velocidad inicial (en m/s)
- Ángulo de lanzamiento (en grados)
Imprime la salida en este formato:
Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} mRedondea la altura máxima a 2 decimales usando Math.Round(value, 2).
Por ejemplo, si las entradas son Rocket, 50, y 45, la salida debería ser:
Gravity: 9.81 m/s^2
Speed of Light: 299792458 m/s
Projectile: Rocket
Initial Velocity: 50 m/s
Launch Angle: 45 degrees
Max Height: 63.71 mHoja de referencia
C# proporciona dos palabras clave para crear valores inmutables: const y readonly.
Un campo const debe asignarse en la declaración, se determina en tiempo de compilación y es implícitamente estático:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}Acceda a las constantes a través del nombre de la clase: GameSettings.MaxPlayers. Las constantes funcionan solo con tipos primitivos, cadenas y null.
Un campo readonly puede asignarse en la declaración o en un constructor, y su valor se determina en tiempo de ejecución:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}Los campos readonly pueden contener cualquier tipo y pueden tener diferentes valores por instancia. Una vez que el constructor finaliza, el valor no puede cambiar.
Use const para valores universales que nunca cambiarán. Use readonly para valores que deban establecerse una vez pero que puedan variar entre objetos o necesiten un cálculo en tiempo de ejecución.
Pruébalo tú mismo
using System;
using Simulation;
class Program
{
public static void Main(string[] args)
{
// Leer las entradas
string name = Console.ReadLine();
double velocity = Convert.ToDouble(Console.ReadLine());
double angle = Convert.ToDouble(Console.ReadLine());
// TODO: Crear un objeto `Projectile` con los valores de entrada
// TODO: Imprimir las constantes físicas (Gravedad con unidad, Velocidad de la luz)
// TODO: Imprimir la información del proyectil (Nombre, Velocidad inicial, Ángulo de lanzamiento)
// TODO: Calcular e imprimir la altura máxima (redondeada a 2 decimales)
}
}
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