Utilizar constructores (Guía de programación de C#)Using Constructors (C# Programming Guide)

Cuando se crea una class o un struct, se llama a su constructor.When a class or struct is created, its constructor is called. Los constructores tienen el mismo nombre que la class o el struct y suelen inicializar los miembros de datos del nuevo objeto.Constructors have the same name as the class or struct, and they usually initialize the data members of the new object.

En el ejemplo siguiente, una clase denominada Taxi se define mediante un constructor simple.In the following example, a class named Taxi is defined by using a simple constructor. Luego, se crea una instancia de la clase con el operador new.This class is then instantiated with the new operator. El constructor Taxi se invoca con el operador new inmediatamente después de asignar memoria para el nuevo objeto.The Taxi constructor is invoked by the new operator immediately after memory is allocated for the new object.

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.A constructor that takes no parameters is called a default constructor. Los constructores predeterminados se invocan cada vez que se crea una instancia de un objeto mediante el operador new y no se especifica ningún argumento en new.Default constructors are invoked whenever an object is instantiated by using the new operator and no arguments are provided to new. Para obtener más información, vea Instance Constructors (Constructores de instancias [Guía de programación de C#]).For more information, see Instance Constructors.

A menos que la clase sea static, las clases sin constructores tienen un constructor público predeterminado por el compilador de C# con el fin de habilitar la creación de instancias de clase.Unless the class is static, classes without constructors are given a public default constructor by the C# compiler in order to enable class instantiation. Para más información, vea Clases estáticas y sus miembros.For more information, see Static Classes and Static Class Members.

Puede impedir que se cree una instancia de una clase convirtiendo el constructor en privado, de la manera siguiente:You can prevent a class from being instantiated by making the constructor private, as follows:

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#]).For more information, see Private Constructors.

Los constructores de tipos struct son similares a los constructores de clases, pero structs no puede contener un constructor predeterminado explícito porque el compilador proporciona uno automáticamente.Constructors for struct types resemble class constructors, but structs cannot contain an explicit default constructor because one is provided automatically by the compiler. Este constructor inicializa cada campo del struct en los valores predeterminados.This constructor initializes each field in the struct to the default values. Para obtener más información, vea Default Values Table (Tabla de valores predeterminados [Referencia de C#]).For more information, see Default Values Table. Pero este constructor predeterminado solo se invoca si las instancias de struct se crean con new.However, this default constructor is only invoked if the struct is instantiated with new. Por ejemplo, este código usa el constructor predeterminado para Int32, por lo que se tiene la certeza de que el entero se inicializa:For example, this code uses the default constructor for Int32, so that you are assured that the integer is initialized:

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

Si bien, el siguiente código genera un error del compilador porque no usa new y porque intenta usar un objeto que no se ha inicializado:The following code, however, causes a compiler error because it does not use new, and because it tries to use an object that has not been initialized:

int i;  
Console.WriteLine(i);  

También puede inicializar o asignar los objetos basados en structs (incluidos todos los tipos numéricos integrados) y luego usarlos como en el ejemplo siguiente:Alternatively, objects based on structs (including all built-in numeric types) can be initialized or assigned and then used as in the following example:

int a = 44;  // Initialize the value type...  
int b;  
b = 33;      // Or assign it before using it.  
Console.WriteLine("{0}, {1}", a, b);  

Por lo que no es necesario llamar al constructor predeterminado para un tipo de valor.So calling the default constructor for a value type is not required.

Tanto las clases como los structs pueden definir constructores que toman parámetros.Both classes and structs can define constructors that take parameters. Los constructores que toman parámetros deben llamarse mediante una instrucción new o base.Constructors that take parameters must be called through a new statement or a base statement. Las clases y structs también pueden definir varios constructores y no es necesario definir un constructor predeterminado.Classes and structs can also define multiple constructors, and neither is required to define a default constructor. Por ejemplo:For example:

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:This class can be created by using either of the following statements:

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.A constructor can use the base keyword to call the constructor of a base class. Por ejemplo:For example:

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.In this example, the constructor for the base class is called before the block for the constructor is executed. La palabra clave base puede usarse con o sin parámetros.The base keyword can be used with or without parameters. Los parámetros del constructor se pueden usar como parámetros en base o como parte de una expresión.Any parameters to the constructor can be used as parameters to base, or as part of an expression. Para obtener más información, vea base.For more information, see base.

En una clase derivada, si un constructor de clase base no se llama explícitamente con la palabra clave base, se llama implícitamente al constructor predeterminado, si hay alguno.In a derived class, if a base-class constructor is not called explicitly by using the base keyword, the default constructor, if there is one, is called implicitly. Esto significa que las siguientes declaraciones del constructor son en efecto iguales:This means that the following constructor declarations are effectively the same:

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.If a base class does not offer a default constructor, the derived class must make an explicit call to a base constructor by using base.

Un constructor puede invocar otro constructor en el mismo objeto mediante la palabra clave this.A constructor can invoke another constructor in the same object by using the this keyword. Igual que base, this puede usarse con o sin parámetros. Además, los parámetros del constructor están disponibles como parámetros en this o como parte de una expresión.Like base, this can be used with or without parameters, and any parameters in the constructor are available as parameters to this, or as part of an expression. Por ejemplo, el segundo constructor del ejemplo anterior se puede reescribir con this:For example, the second constructor in the previous example can be rewritten using this:

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

El uso de la palabra clave this en el ejemplo anterior llama a este constructor:The use of the this keyword in the previous example causes this constructor to be called:

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

Los constructores se pueden marcar como public, private, protected, internal, protected internal o private protected.Constructors can be marked as public, private, protected, internal, protected internal or private protected. Estos modificadores de acceso definen cómo los usuarios de la clase pueden construir la clase.These access modifiers define how users of the class can construct the class. Para obtener más información, consulte Modificadores de acceso.For more information, see Access Modifiers.

Un constructor puede declararse estático mediante la palabra clave static.A constructor can be declared static by using the static keyword. Los constructores estáticos se llaman automáticamente, inmediatamente antes de acceder a los campos estáticos y, por lo general, se usan para inicializar miembros de clase estática.Static constructors are called automatically, immediately before any static fields are accessed, and are generally used to initialize static class members. Para obtener más información, vea Static Constructors (Constructores estáticos [Guía de programación de C#]).For more information, see Static Constructors.

Especificación del lenguaje C#C# Language Specification

Para obtener más información, vea las secciones Constructores de instancia y Constructores estáticos de la Especificación del lenguaje C#.For more information, see Instance constructors and Static constructors in the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee Also