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

Los constructores de instancias se usan para crear e inicializar cualquier variable de miembro de instancia cuando se usa la expresión new para crear un objeto de una clase. Para inicializar una clase estática o variables estáticas en una clase no estática, se ha de definir un constructor estático. Para obtener más información, vea Constructores estáticos (Guía de programación de C#).

En el ejemplo siguiente, se muestra un constructor de instancia:

class CoOrds
{
    public int x, y;

    // constructor
    public CoOrds()
    {
        x = 0;
        y = 0;
    }
}

Nota

Para mayor claridad, esta clase contiene campos públicos. A la hora de programar, no se recomienda usar campos públicos porque permiten que cualquier método en cualquier parte de un programa obtenga acceso sin restricciones ni comprobaciones al funcionamiento interno de un objeto. Los miembros de datos generalmente deberían ser privados y sólo se debería obtener acceso a ellos a través de los métodos y propiedades de clase.

Este constructor de instancia se invoca cada vez que se crea un objeto basado en la clase CoOrds. Un constructor como éste, que no toma ningún argumento, se denomina constructor predeterminado. Sin embargo, suele ser útil proporcionar constructores adicionales. Por ejemplo, se puede agregar a la clase CoOrds un constructor que permita especificar los valores iniciales de los miembros de datos:

// tcA constructor with two arguments:
public CoOrds(int x, int y)
{
    this.x = x;
    this.y = y;
}

Esto permite crear objetos CoOrd con valores iniciales concretos o predeterminados, del modo siguiente:

CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);

Si una clase no tiene un constructor, se genera automáticamente un constructor predeterminado y se usan valores predeterminados para inicializar los campos de objeto. Por ejemplo, un int se inicializa a 0. Para obtener más información sobre los valores predeterminados, vea Tabla de valores predeterminados (Referencia de C#). Por consiguiente, como el constructor predeterminado de la clase CoOrds inicializa todos los miembros de datos en cero, se puede quitar del todo sin cambiar el funcionamiento de la clase. En el ejemplo 1, más adelante en este tema, hay un objeto completo del uso de varios constructores. Además, en el ejemplo 2 se proporciona un ejemplo de un constructor generado automáticamente.

Los constructores de instancia también se pueden utilizar para llamar a los constructores de instancia de clases base. El constructor de clase puede invocar el constructor de la clase base a través del inicializador, del modo siguiente:

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {
    }
}

En este ejemplo, la clase Circle pasa los valores que representan el radio y alto al constructor proporcionado por Shape del que se deriva Circle. En el ejemplo 3 de este tema aparece un ejemplo completo del uso de Shape y Circle.

Ejemplo 1

En el siguiente ejemplo se muestra una clase con dos constructores de clase, uno sin argumentos y el otro con dos argumentos.

class CoOrds
{
    public int x, y;

    // Default constructor:
    public CoOrds()
    {
        x = 0;
        y = 0;
    }

    // tcA constructor with two arguments:
    public CoOrds(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    // Override the ToString method:
    public override string ToString()
    {
        return (String.Format("({0},{1})", x, y));
    }
}

class MainClass
{
    static void Main()
    {
        CoOrds p1 = new CoOrds();
        CoOrds p2 = new CoOrds(5, 3);

        // Display the results using the overriden ToString method:
        Console.WriteLine("CoOrds #1 at {0}", p1);
        Console.WriteLine("CoOrds #2 at {0}", p2);
        Console.ReadKey();
    }
}
/* Output:
 CoOrds #1 at (0,0)
 CoOrds #2 at (5,3)        
*/

Ejemplo 2

En este ejemplo, la clase Person no tiene ningún constructor, por lo que se proporciona automáticamente un constructor predeterminado y los campos se inicializan con los valores predeterminados.

public class Person
{
    public int age;
    public string name;
}

class TestPerson
{
    static void Main()
    {
        Person person = new Person();

        Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output:  Name: , Age: 0

Observe que el valor predeterminado de age es 0 y el de name es null. Para obtener más información sobre los valores predeterminados, vea Tabla de valores predeterminados (Referencia de C#).

Ejemplo 3

En el siguiente ejemplo se muestra el uso del inicializador de clase base. La clase Circle se deriva de la clase general Shape y la clase Cylinder se deriva de la clase Circle. El constructor utiliza su inicializador de clase base en cada clase derivada.

abstract class Shape
{
    public const double pi = Math.PI;
    protected double x, y;

    public Shape(double x, double y)
    {
        this.x = x;
        this.y = y;
    }

    public abstract double Area();
}

class Circle : Shape
{
    public Circle(double radius)
        : base(radius, 0)
    {
    }
    public override double Area()
    {
        return pi * x * x;
    }
}

class Cylinder : Circle
{
    public Cylinder(double radius, double height)
        : base(radius)
    {
        y = height;
    }

    public override double Area()
    {
        return (2 * base.Area()) + (2 * pi * x * y);
    }
}

class TestShapes
{
    static void Main()
    {
        double radius = 2.5;
        double height = 3.0;

        Circle ring = new Circle(radius);
        Cylinder tube = new Cylinder(radius, height);

        Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
        Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Area of the circle = 19.63
    Area of the cylinder = 86.39
*/

Para obtener más ejemplos sobre cómo invocar los constructores de clase base, vea virtual (Referencia de C#), override (Referencia de C#) y base (Referencia de C#).

Vea también

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#)

static (Referencia de C#)

Conceptos

Guía de programación de C#