Encadenamiento de constructores con this
Reutilice la inicialización entre constructores.
Encadenamiento de constructores con this es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 2 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.
¿Por qué encadenar constructores?
Cuando varios constructores comparten la lógica de configuración, puede encadenarlos para que uno llame a otro. Así evita duplicar código y mantiene la inicialización en un solo lugar.
using System;
class Box
{
public int Width;
public int Height;
public Box(int width, int height)
{
Width = width;
Height = height;
}
public Box() : this(1, 1) { }
}
class Program
{
static void Main()
{
var def = new Box();
Console.WriteLine(def.Width + "x" + def.Height);
}
}La sintaxis : this(...)
El encadenamiento usa : this(args) después de la firma del constructor. El constructor invocado se ejecuta primero y, después, se ejecuta el cuerpo actual.
using System;
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
Console.WriteLine("Full constructor ran");
}
public Person(string name) : this(name, 0)
{
Console.WriteLine("Name-only constructor ran");
}
}
class Program
{
static void Main()
{
var p = new Person("Sam");
Console.WriteLine(p.Name + ", " + p.Age);
}
}Orden de ejecución
El constructor encadenado se ejecuta antes que el cuerpo del constructor que lo invoca. Esto garantiza que la configuración básica se realice primero.
using System;
class Step
{
public Step(int n)
{
Console.WriteLine("Init with " + n);
}
public Step() : this(0)
{
Console.WriteLine("Then default body");
}
}
class Program
{
static void Main()
{
var s = new Step();
}
}Una única fuente de verdad
Dirija todos los constructores a un constructor «principal» que contenga la lógica real. Los demás solo proporcionan valores predeterminados y delegan en él.
using System;
class Connection
{
public string Host;
public int Port;
public Connection(string host, int port)
{
Host = host;
Port = port;
}
public Connection(string host) : this(host, 8080) { }
public Connection() : this("localhost", 8080) { }
}
class Program
{
static void Main()
{
var c = new Connection("example.com");
Console.WriteLine(c.Host + ":" + c.Port);
}
}Encadenamiento con valores predeterminados
El encadenamiento es una forma clara de expresar valores predeterminados por capas: cada constructor más corto completa un valor predeterminado adicional y delega en el siguiente.
using System;
class Coffee
{
public string Size;
public bool Milk;
public int Sugar;
public Coffee(string size, bool milk, int sugar)
{
Size = size;
Milk = milk;
Sugar = sugar;
}
public Coffee(string size, bool milk) : this(size, milk, 0) { }
public Coffee(string size) : this(size, false) { }
}
class Program
{
static void Main()
{
var c = new Coffee("large");
Console.WriteLine(c.Size + ", milk=" + c.Milk + ", sugar=" + c.Sugar);
}
}Validación en el constructor invocado
Como todos los constructores pasan por el principal, la validación escrita allí protege todas las rutas de creación.
using System;
class Rect
{
public int W;
public int H;
public Rect(int w, int h)
{
if (w <= 0 || h <= 0)
throw new ArgumentException("Dimensions must be positive");
W = w;
H = h;
}
public Rect(int side) : this(side, side) { }
}
class Program
{
static void Main()
{
var square = new Rect(5);
Console.WriteLine(square.W + "x" + square.H);
}
}Encadenamiento frente a parámetros predeterminados
Los parámetros predeterminados pueden sustituir muchas sobrecargas, pero el encadenamiento es más claro cuando cada constructor necesita una lógica ligeramente distinta en su cuerpo.
using System;
class Logger
{
public string Prefix;
public bool Verbose;
public Logger(string prefix, bool verbose)
{
Prefix = prefix;
Verbose = verbose;
}
public Logger(string prefix) : this(prefix, false)
{
Console.WriteLine("Created quiet logger");
}
}
class Program
{
static void Main()
{
var log = new Logger("APP");
Console.WriteLine(log.Prefix + " verbose=" + log.Verbose);
}
}Los cuerpos vacíos son habituales
Un constructor que encadena a otro suele tener un cuerpo vacío { } porque todo el trabajo se realiza en el constructor invocado.
using System;
class Vector
{
public double X, Y, Z;
public Vector(double x, double y, double z)
{
X = x; Y = y; Z = z;
}
public Vector(double v) : this(v, v, v) { }
}
class Program
{
static void Main()
{
var v = new Vector(2);
Console.WriteLine(v.X + "," + v.Y + "," + v.Z);
}
}Cómo evitar ciclos
Los constructores no deben encadenarse en un bucle (A llama a B y B llama a A). El compilador rechaza las cadenas circulares de : this(...).
using System;
class Safe
{
public int A, B;
public Safe(int a, int b)
{
A = a;
B = b;
}
public Safe(int a) : this(a, 0) { } // chains one direction only
}
class Program
{
static void Main()
{
var s = new Safe(7);
Console.WriteLine(s.A + ", " + s.B);
}
}Combinación con this.field
Puede encadenar constructores y seguir usando this. en el cuerpo para realizar cualquier configuración adicional después de que el constructor invocado devuelva el control.
using System;
class Account
{
public string Owner;
public decimal Balance;
public bool Active;
public Account(string owner, decimal balance)
{
this.Owner = owner;
this.Balance = balance;
}
public Account(string owner) : this(owner, 0m)
{
this.Active = true;
}
}
class Program
{
static void Main()
{
var a = new Account("Rin");
Console.WriteLine(a.Owner + " active=" + a.Active);
}
}Integración
El encadenamiento mantiene una clase DRY: un constructor valida y asigna valores, mientras que los demás proporcionan atajos prácticos.
using System;
class Pizza
{
public string Size;
public int Toppings;
public Pizza(string size, int toppings)
{
if (toppings < 0) throw new ArgumentException("toppings");
Size = size;
Toppings = toppings;
}
public Pizza(string size) : this(size, 0) { }
public Pizza() : this("medium") { }
}
class Program
{
static void Main()
{
var p = new Pizza();
Console.WriteLine(p.Size + " with " + p.Toppings + " toppings");
}
}Comprobación rápida
Compruebe cuánto comprende sobre el encadenamiento de constructores.
Recapitulación
El encadenamiento de constructores usa : this(args) para llamar a otro constructor de la misma clase. El constructor invocado se ejecuta primero y, después, se ejecuta el cuerpo actual. Dirija todos los constructores a un constructor principal para centralizar la validación y evitar configuraciones duplicadas. No se permiten cadenas circulares.
using System;
class Demo
{
public int X, Y;
public Demo(int x, int y) { X = x; Y = y; }
public Demo(int both) : this(both, both) { }
}
class Program
{
static void Main()
{
var d = new Demo(4);
Console.WriteLine(d.X + "," + d.Y);
}
}Preguntas frecuentes
¿La lección «Encadenamiento de constructores con this» es gratis?
Sí — el texto completo de «Encadenamiento de constructores con this» 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 «Encadenamiento de constructores con this»?
Reutilice la inicialización entre constructores. 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 2 de 4.
¿Cuánto tiempo toma la lección «Encadenamiento de constructores con this»?
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
- Definición de constructores
- Encadenamiento de constructores con this
- Inicializadores de objetos y colecciones
- Constructores estáticos