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 evitan 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;
}Se accede 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 diferentes valores 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 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
constllamadoGravityestablecido en9.81 - Un campo
constllamadoSpeedOfLightestablecido en299792458 - Un campo
constde tipo string llamadoGravityUnitestablecido 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
readonlyllamadoName(string) - Un campo
readonlyllamadoInitialVelocity(double) - Un campo
readonlyllamadoLaunchAngle(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 usando 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 mPrué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