Constructores (guía de programación de C#)
Un constructor es un método llamado por el tiempo de ejecución cuando se crea una instancia de la clase o de la estructura . Una clase o estructura puede tener varios constructores que toman argumentos diferentes. Los constructores permiten asegurarse de que las instancias del tipo son válidas cuando se crean. Para obtener más información y ejemplos, vea Constructores de instancias y Uso de constructores.
Hay varias acciones que forman parte de la inicialización de una nueva instancia. Las siguientes acciones tienen lugar en el orden siguiente:
- Campos de instancia se establecen en 0. Normalmente, el tiempo de ejecución realiza esta inicialización.
- Ejecución de inicializadores de campo. Inicializadores de campo en la ejecución del tipo más derivado.
- Ejecución de inicializadores de campo de tipo base. Inicializadores de campo a partir de la base directa a través de cada tipo base para System.Object.
- Ejecución de constructores de instancia base. Cualquier constructor de instancia, comenzando por Object.Object y pasando por cada clase base hasta llegar a la clase base directa.
- El constructor de instancia ejecuta. El constructor estático para el tipo se ejecuta.
- Ejecución de inicializadores de objeto. Si la expresión incluye inicializadores de objeto, se ejecutan después de que se ejecute el constructor de instancia. Los inicializadores de objeto se ejecutan en el orden textual.
Las acciones anteriores se realizan cuando se crea una instancia mediante el operador new
. Si una nueva instancia de un struct
se establece en su valor de default
, todos los campos de instancia se establecen en 0. Los elementos de una matriz se establecen en su valor predeterminado de 0 o null
cuando se crea una matriz.
El constructor estático , si existe, se ejecuta antes de que se realice alguna de las acciones del constructor de instancia para cualquier instancia del tipo . El constructor estático se ejecuta como máximo una vez.
Sintaxis del constructor
Un constructor es un método con el mismo nombre que su tipo. Su firma de método puede incluir un modificador de acceso opcional , el nombre del método y su lista de parámetros; no incluye un tipo de valor devuelto. En el ejemplo siguiente se muestra el constructor de una clase denominada Person
.
public class Person
{
private string last;
private string first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
// Remaining implementation of Person class.
}
Si un constructor puede implementarse como una instrucción única, puede usar un miembro del cuerpo de expresión. En el ejemplo siguiente se define una clase Location
cuyo constructor tiene un único parámetro de cadena denominado nombre. La definición del cuerpo de expresión asigna el argumento al campo locationName
.
public class Location
{
private string locationName;
public Location(string name) => Name = name;
public string Name
{
get => locationName;
set => locationName = value;
}
}
Si un tipo requiere un parámetro para crear una instancia, puede usar un constructor principal de para indicar que se requieren uno o varios parámetros para crear una instancia del tipo, como se muestra en el ejemplo siguiente:
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents
{
get;
init;
}
}
Constructores estáticos
En los ejemplos anteriores se muestran constructores de instancia, que inicializan un nuevo objeto. Una clase o estructura también puede declarar un constructor estático, que inicializa los miembros estáticos del tipo. Los constructores estáticos no tienen parámetros. Si no proporciona un constructor estático para inicializar campos estáticos, el compilador de C# inicializa los campos estáticos en su valor predeterminado tal como se muestra en el Valores predeterminados de tipos de C# artículo.
En el ejemplo siguiente se usa un constructor estático para inicializar un campo estático.
public class Adult : Person
{
private static int minimumAge;
public Adult(string lastName, string firstName) : base(lastName, firstName)
{ }
static Adult() => minimumAge = 18;
// Remaining implementation of Adult class.
}
También puede definir un constructor estático con una definición de cuerpo de expresión, como se muestra en el ejemplo siguiente.
public class Child : Person
{
private static int maximumAge;
public Child(string lastName, string firstName) : base(lastName, firstName)
{ }
static Child() => maximumAge = 18;
// Remaining implementation of Child class.
}
Para obtener más información y ejemplos, vea Constructores estáticos.