0Pricing
C# Academy · Lección

Constantes y campos readonly

Distinga entre const y static readonly.

Constantes y campos readonly es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

Dos formas de hacer que los valores sean inmutables

C# ofrece const y readonly para los valores que no deben cambiar. Parecen similares, pero se comportan de forma muy distinta. En esta lección se comparan ambas opciones.

using System;

class Config
{
    public const double Pi = 3.14159;
    public static readonly DateTime StartedAt = DateTime.Now;
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Pi = " + Config.Pi);
    }
}

const: constante en tiempo de compilación

Un const debe recibir un valor literal al declararse y queda incorporado en tiempo de compilación. Es implícitamente estático.

using System;

class Circle
{
    public const double Pi = 3.14159;

    public static double Area(double r) => Pi * r * r;
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Circle.Area(2).ToString("0.00"));
    }
}

const debe ser un literal

Como se resuelve en tiempo de compilación, un const solo puede contener una expresión constante: números, cadenas, valores booleanos u otros const.

using System;

class Limits
{
    public const int MaxRetries = 3;
    public const int Timeout = MaxRetries * 1000;   // const expression OK
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Limits.MaxRetries + ", " + Limits.Timeout);
    }
}

readonly: constante en tiempo de ejecución

Un campo readonly se establece una vez, ya sea en su declaración o en un constructor, y después no puede cambiar. Su valor se puede calcular en tiempo de ejecución.

using System;

class Session
{
    public readonly string Id;

    public Session(string id)
    {
        Id = id;   // allowed: inside constructor
    }
}

class Program
{
    static void Main()
    {
        var s = new Session("abc-123");
        Console.WriteLine("Session: " + s.Id);
    }
}

readonly puede usar valores de ejecución

A diferencia de const, un campo readonly puede contener un valor que solo se conoce cuando se ejecuta el programa, como un id generado o la hora actual.

using System;

class Order
{
    public readonly Guid OrderId;

    public Order()
    {
        OrderId = Guid.NewGuid();
    }
}

class Program
{
    static void Main()
    {
        var o = new Order();
        Console.WriteLine("Has id: " + (o.OrderId != Guid.Empty));
    }
}

static readonly

Combine static readonly para obtener un valor de ámbito de clase que se calcule una vez en tiempo de ejecución. Es el sustituto habitual de const cuando el valor no es un literal.

using System;

class AppInfo
{
    public static readonly string[] Roles = { "admin", "user", "guest" };
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Roles: " + Roles());
    }

    static int Roles() => AppInfo.Roles.Length;
}

Por qué const puede ser arriesgado entre ensamblados

Dado que los valores const se insertan en el código que realiza la llamada durante la compilación, modificar un const público de una biblioteca requiere recompilar todos sus consumidores. static readonly evita este problema.

using System;

class Lib
{
    public const int Version = 2;              // inlined into callers
    public static readonly int Build = 100;     // read at runtime
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Lib.Version + "." + Lib.Build);
    }
}

No se puede reasignar ninguno de los dos

Después de la inicialización, no se puede cambiar ni un campo const ni uno readonly. Intentar hacerlo provoca un error de compilación.

using System;

class Demo
{
    public const int A = 10;
    public readonly int B;

    public Demo() { B = 20; }
    // A = 11;  // would not compile
    // B = 21;  // would not compile outside constructor
}

class Program
{
    static void Main()
    {
        var d = new Demo();
        Console.WriteLine(Demo.A + ", " + d.B);
    }
}

Cómo elegir entre ellos

Utilice const para literales verdaderos que nunca cambian (Pi, MaxInt). Utilice readonly cuando el valor se calcule en tiempo de ejecución o pueda variar según la instancia.

using System;

class Physics
{
    public const double Gravity = 9.81;          // universal literal
    public readonly double Mass;                  // per object

    public Physics(double mass) { Mass = mass; }
    public double Weight() => Mass * Gravity;
}

class Program
{
    static void Main()
    {
        var p = new Physics(10);
        Console.WriteLine("Weight: " + p.Weight());
    }
}

Precaución con las referencias readonly

readonly bloquea el campo, no el objeto al que apunta. Una referencia readonly a una lista no se puede reasignar, pero su contenido aún puede cambiar.

using System;
using System.Collections.Generic;

class Cart
{
    public readonly List<string> Items = new List<string>();
}

class Program
{
    static void Main()
    {
        var c = new Cart();
        c.Items.Add("Pen");   // allowed: mutating the object
        c.Items.Add("Book");
        Console.WriteLine("Items: " + c.Items.Count);
    }
}

Unir todas las piezas

Una clase típica utiliza const para literales fijos y readonly para valores que quedan fijados por instancia durante la construcción.

using System;

class Account
{
    public const decimal MinBalance = 0m;
    public readonly string Owner;

    public Account(string owner)
    {
        Owner = owner;
    }
}

class Program
{
    static void Main()
    {
        var a = new Account("Rin");
        Console.WriteLine(a.Owner + " min=" + Account.MinBalance);
    }
}

Comprobación rápida

Compruebe su comprensión de const frente a readonly.

Resumen

const es un literal de tiempo de compilación, es implícitamente static y se inserta en el código que realiza las llamadas. readonly se establece una vez en la declaración o en un constructor y puede utilizar valores de tiempo de ejecución. Utilice const para literales verdaderos, static readonly para valores compartidos calculados en tiempo de ejecución y recuerde que readonly bloquea la referencia, no el objeto.

using System;

class Demo
{
    public const int Max = 100;
    public readonly int Created;
    public Demo(int c) { Created = c; }
}

class Program
{
    static void Main()
    {
        var d = new Demo(7);
        Console.WriteLine(Demo.Max + ", " + d.Created);
    }
}

Preguntas frecuentes

¿La lección «Constantes y campos readonly» es gratis?

Sí — el texto completo de «Constantes y campos readonly» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Constantes y campos readonly»?

Distinga entre const y static readonly. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Constantes y campos readonly»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Métodos y campos estáticos
  2. Clases estáticas para utilidades
  3. Constantes y campos readonly
  4. Diseño estático frente a diseño de instancia
← Volver a C# Academy