Compartir vía


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 newy 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 thiso 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#.

Consulte también