Utilizar constructores (Guía de programación de C#)

Actualización: noviembre 2007

Los constructores son métodos de clase que se ejecutan cuando se crea un objeto de un tipo determinado. Los constructores tienen el mismo nombre que la clase y, normalmente, inicializan los miembros de datos del nuevo objeto.

En el ejemplo siguiente, una clase denominada Taxi se define mediante un constructor simple. Esta clase crea instancias con el operador new. El operador new invoca el constructor Taxi inmediatamente después de asignar la memoria al nuevo objeto.

public class Taxi
{
    public bool isInitialized;
    public Taxi()
    {
        isInitialized = true;
    }
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi();
        Console.WriteLine(t.isInitialized);
    }
}

Un constructor que no toma ningún parámetro se denomina constructor predeterminado. Los constructores predeterminados se invocan cada vez que se crea una instancia de un objeto mediante el operador new y no se proporciona ningún argumento a new. Para obtener más información, vea Constructores de instancias (Guía de programación de C#).

A menos que la clase sea estática, a las clases sin constructores se les asigna un constructor público predeterminado a través del compilador de C# con el fin de habilitar la creación de instancias de clases. Para obtener más información, vea Clases estáticas y sus miembros (Guía de programación de C#).

Es posible evitar que se creen instancias de una clase mediante la conversión del constructor a privado, como se muestra a continuación:

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

Para obtener más información, vea Constructores privados (Guía de programación de C#).

Los constructores para los tipos struct son similares a los constructores de clases, pero los tipos structs no pueden contener un constructor predeterminado explícito porque el compilador proporciona uno automáticamente. Este constructor inicializa cada campo del tipo struct con los valores predeterminados. Para obtener más información, vea Tabla de valores predeterminados (Referencia de C#). Sin embargo, este constructor predeterminado sólo se invoca si se crean instancias del tipo struct con new. Por ejemplo, en este código se utiliza el constructor predeterminado para Int32, lo que garantiza la inicialización del tipo entero:

int i = new int();
Console.WriteLine(i);

Sin embargo, el código siguiente produce el Error del compilador CS0165 porque no se utiliza new y se intenta utilizar un objeto que no se ha inicializado:

int i;
Console.WriteLine(i);

Como alternativa, se pueden inicializar objetos basados en structs (incluidos todos los tipos numéricos integrados) o asignarse y, a continuación, utilizarse 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);

En consecuencia no se requiere llamar al constructor predeterminado para un tipo de valor.

Tanto las clases como las structs pueden definir constructores que acepten parámetros. Se debe llamar a constructores que toman parámetros a través de una instrucción new o base. Las clases y las structs también pueden definir varios constructores y no se requiere ninguno para definir un constructor predeterminado. Por ejemplo:

public class Employee
{
    public int salary;

    public Employee(int annualSalary)
    {
        salary = annualSalary;
    }

    public Employee(int weeklySalary, int numberOfWeeks)
    {
        salary = weeklySalary * numberOfWeeks;
    }
}

Esta clase se puede crear mediante cualquiera de las siguientes instrucciones:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

Cualquier constructor puede utilizar 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 ejecutar el bloque del constructor. La palabra clave base se puede utilizar con o sin parámetros. Cualquier parámetro del constructor se puede utilizar como parámetro de base o como parte de una expresión. Para obtener más información, vea base (Referencia de C#).

En una clase derivada, si no se llama explícitamente al constructor de la clase base mediante la palabra clave base, se llamará implícitamente al constructor predeterminado, si existe alguno. Esto significa que las siguientes declaraciones del constructor son efectivamente las mismas:

public Manager(int initialdata)
{
    //Add further instructions here.
}
public Manager(int initialdata)
    : base()
{
    //Add further instructions here.
}

Si una clase base no proporciona un constructor predeterminado, la clase derivada debe realizar una llamada explícita a un constructor base mediante base.

Un constructor puede invocar a otro constructor en el mismo objeto mediante la palabra clave this. Al igual que base, this se puede utilizar con o sin parámetros y cualquier parámetro en el constructor está disponible como parámetro para this o como parte de una expresión. Por ejemplo, el segundo constructor del ejemplo anterior se puede rescribir con 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 a este constructor:

public Employee(int annualSalary)
{
    salary = annualSalary;
}

Los constructores se pueden marcar como public, private, protected, internal o protectedinternal. Estos modificadores de acceso definen cómo los usuarios de la clase pueden construir la clase. Para obtener más información, vea Modificadores de acceso (Guía de programación de C#).

Un constructor se puede declarar como estático mediante la palabra clave static. Se llama automáticamente a los constructores estáticos de forma inmediata antes de que se tenga acceso a cualquier campo estático, y, generalmente, se utilizan para inicializar los miembros de clase estáticos. Para obtener más información, vea Constructores estáticos (Guía de programación de C#).

Especificación del lenguaje C#

Para obtener más información, vea las siguientes secciones en la Especificación del lenguaje C#:

  • 1.6.7.1 Constructores

  • 10.11 Constructores de instancia (Clases)

  • 11.3.8 Constructores (Estructuras)

  • 11.3.10 Constructores estáticos (Estructuras)

Vea también

Conceptos

Guía de programación de C#

Referencia

Clases y estructuras (Guía de programación de C#)

Constructores (Guía de programación de C#)

Destructores (Guía de programación de C#)