Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Vamos 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 clase PhysicsConstants en el espacio de nombres Simulation. Esta clase debe contener constantes universales que nunca cambian y son las mismas en todas partes:
    • Un campo const Gravity establecido en 9.81
    • Un campo const SpeedOfLight establecido en 299792458
    • Un campo const de tipo string GravityUnit establecido en "m/s^2"
  • Projectile.cs: Define una clase Projectile en el espacio de nombres Simulation. Cada proyectil tiene valores que deben establecerse una vez al crearse y nunca modificarse después:
    • Un campo readonly Name (string)
    • Un campo readonly InitialVelocity (double)
    • Un campo readonly LaunchAngle (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). Usa Math.Sin() y convierte los grados a radianes multiplicando por Math.PI / 180
  • 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} m

Redondea 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 m

Hoja 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)
    }
}
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