Конструкторы экземпляров (руководство по программированию в C#)

Обновлен: Ноябрь 2007

Конструкторы экземпляров используется для создания и инициализации экземпляров. Конструктор класса вызывается при создании нового объекта, например:

class CoOrds
{
    public int x, y;

    // constructor
    public CoOrds()
    {
        x = 0;
        y = 0;
    }
}
k6sa6h87.alert_note(ru-ru,VS.90).gifПримечание.

Следует пояснить, что этот класс содержит открытые члены данных. Такой подход не рекомендуется использовать на практике, поскольку в этом случае любой метод в любом месте программы получает неограниченный и неконтролируемый доступ к внутренней работе объекта. Члены данных обычно должны быть закрытыми, а доступ к ним должен осуществляться только посредством методов и свойства класса.

Этот конструктор вызывается каждый раз при создании объекта на базе класса CoOrds. Такой конструктор без аргументов называется конструктором по умолчанию. Зачастую такие конструкторы используются для предоставления дополнительных конструкторов. Например, можно добавить конструктор в класс CoOrds, позволяющий указывать начальные значения для членов данных:

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

Это позволяет создавать объекты CoOrd с начальными значениями по умолчанию или с другими начальными значениями:

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

Если у класса нет конструктора по умолчанию, такой конструктор создается автоматически, а для инициализации полей объектов используются значения по умолчанию, int инициализируется со значением 0. Дополнительные сведения о значениях по умолчанию см. в разделе Таблица значений по умолчанию (Справочник по C#). Следовательно, поскольку конструктор по умолчанию класса CoOrds инициализирует все члены данных с нулевыми значениями, его можно удалить, при этом порядок работы класса не изменится. Полный пример использования нескольких конструкторов см. в данном разделе в примере 1; пример автоматически созданного конструктора см. в примере 2.

Конструкторы экземпляров также можно использовать для вызова конструкторов экземпляров базового класса. Конструктор класса может вызвать конструктор базового класса с помощью инициализатора:

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

В этом примере класс Circle передает значения радиуса и высоты конструктору, предоставленному классом Shape, для которого класс Circle является производным. Полный текст кода с использованием классов Shape и Circle см. в данном разделе в примере 3.

Пример 1

В следующем примере демонстрируется класс с двумя конструкторами, один из которых не имеет аргументов, а второй имеет два аргумента.

class CoOrds
{
    public int x, y;

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

    // A 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)        
*/

Пример 2

В этом примере класс Person не имеет конструкторов, поэтому автоматически предоставляется конструктор по умолчанию, а все поля инициализируются со значениями по умолчанию.

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

Обратите внимание, что в значение по умолчанию age равно 0, а значение по умолчанию name равно null. Дополнительные сведения о значениях по умолчанию см. в разделе Таблица значений по умолчанию (Справочник по C#).

Пример 3

В следующем примере кода демонстрируется использование инициализатора базового класса. Класс Circle является производным от основного класса Shape, а класс Cylinder является производным от класса Circle. Конструктор каждого производного класса использует инициализатор своего базового класса.

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
*/

Дополнительные примеры вызова конструкторов базовых классов см. в разделах virtual (Справочник по C#), override (справочник по C#) и base (Справочник по C#).

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Классы и структуры (Руководство по программированию в C#)

Конструкторы (руководство по программированию на C#)

Деструкторы (руководство по программированию в C#)

static (Справочник по C#)