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 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.

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 llamado Gravity establecido en 9.81
    • Un campo const llamado SpeedOfLight establecido en 299792458
    • Un campo const de tipo string llamado 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 llamado Name (string)
    • Un campo readonly llamado InitialVelocity (double)
    • Un campo readonly llamado 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 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} 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

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