Uso de constructores (guía de programación de C#)
Cuando se instancia una clase o estructura, el tiempo de ejecución llama a su constructor. Los constructores tienen el mismo nombre que la clase o estructura, y normalmente inicializan los miembros de datos del nuevo objeto.
En el ejemplo siguiente, se define una clase denominada Taxi
mediante un constructor simple. A continuación, se crea una instancia de esta clase con el operador new
. El tiempo de ejecución invoca al constructor Taxi
inmediatamente después de asignar memoria para el nuevo objeto.
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
Un constructor que no toma parámetros se denomina constructor sin parámetros . El tiempo de ejecución invoca al constructor sin parámetros cuando se crea una instancia de un objeto mediante el operador new
y no se proporciona ningún argumento para new
. C# 12 introdujo constructores principales. Un constructor principal especifica parámetros que se deben proporcionar para inicializar un nuevo objeto. Para obtener más información, vea Instance Constructors (Constructores de instancias [Guía de programación de C#]).
A menos que la clase sea estática, las clases sin constructores reciben un constructor público sin parámetros mediante el compilador de C# para habilitar la creación de instancias de clase. Para más información, vea Clases estáticas y sus miembros.
Puede evitar que se cree una instancia de una clase haciendo que el constructor sea privado, como se indica a continuación:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Para obtener más información, vea Private Constructors (Constructores privados [Guía de programación de C#]).
Los constructores de los tipos struct se asemejan a los constructores de clase. Cuando se crea una instancia de un tipo de estructura con new
, el tiempo de ejecución invoca un constructor. Cuando un struct
se establece en su valor de default
, el tiempo de ejecución inicializa toda la memoria de la estructura en 0. Si declara cualquier inicializador de campo en un tipo struct
, debe proporcionar un constructor sin parámetros. Para obtener más información, consulte la sección Inicialización de Estructura y Valores Predeterminados del artículo Tipos de Estructura.
El código siguiente usa el constructor sin parámetros para Int32, de modo que esté seguro de que el entero se inicializa:
int i = new int();
Console.WriteLine(i);
Sin embargo, el código siguiente produce un error del compilador porque no usa new
y porque intenta usar un objeto que no se inicializa:
int i;
Console.WriteLine(i);
Como alternativa, algunos tipos de struct
(incluidos todos los tipos numéricos integrados) se pueden inicializar o asignar y, a continuación, se pueden usar como en el ejemplo siguiente:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
Ambas clases y estructuras pueden definir constructores que toman parámetros, incluidos los constructores principales . Los constructores que toman parámetros deben llamarse mediante una instrucción new
o base. Las clases y estructuras también pueden definir varios constructores y tampoco es necesario definir un constructor sin parámetros. Por ejemplo:
public class Employee
{
public int Salary;
public Employee() { }
public Employee(int annualSalary) => Salary = annualSalary;
public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}
Esta clase se puede crear mediante cualquiera de las instrucciones siguientes:
Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);
Un constructor puede usar la palabra clave base
para llamar al constructor de una clase base. Por ejemplo:
public class Manager : Employee
{
public Manager(int annualSalary)
: base(annualSalary)
{
//Add further instructions here.
}
}
En este ejemplo, se llama al constructor de la clase base antes de que se ejecute el bloque para el constructor. La palabra clave base
se puede usar con o sin parámetros. Los parámetros del constructor se pueden usar como parámetros para base
, o como parte de una expresión. Para obtener más información, vea base.
En una clase derivada, si no se llama explícitamente a un constructor de clase base mediante la palabra clave base
, se llama implícitamente al constructor sin parámetros, si hay uno. En la práctica. las siguientes declaraciones de constructor son iguales:
public Manager(int initialData)
{
//Add further instructions here.
}
public Manager(int initialData)
: base()
{
//Add further instructions here.
}
Si una clase base no ofrece un constructor sin parámetros, la clase derivada debe realizar una llamada explícita a un constructor base mediante base
.
Un constructor puede invocar otro constructor en el mismo objeto mediante la palabra clave this
. Al igual que base
, this
se puede usar con o sin parámetros, y los parámetros del constructor están disponibles como parámetros para this
o como parte de una expresión. Por ejemplo, el segundo constructor del ejemplo anterior se puede volver a escribir mediante this
:
public Employee(int weeklySalary, int numberOfWeeks)
: this(weeklySalary * numberOfWeeks)
{
}
El uso de la palabra clave this
en el ejemplo anterior hace que se llame al siguiente constructor:
public Employee(int annualSalary) => Salary = annualSalary;
Los constructores se pueden marcar como public
, private
, protected
, internos, internos protegidos o private protected
. Estos modificadores de acceso definen cómo los usuarios de la clase pueden construir la clase . Para obtener más información, consulte Modificadores de acceso.
Un constructor se puede declarar estático mediante la palabra clave static
. Los constructores estáticos se llaman automáticamente, antes de que se acceda a los campos estáticos y se usan para inicializar miembros de clase estática. Para obtener más información, vea Static Constructors (Constructores estáticos [Guía de programación de C#]).
Especificación del lenguaje C#
Para obtener más información, vea las secciones Constructores de instancia y Constructores estáticos de la Especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.