Поделиться через


Использование конструкторов (руководство по программированию в C#)

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

Конструкторы — это методы классов, выполняемые при создании объекта заданного типа. Конструкторы имеют такое же имя, как и классы, и обычно инициализируют члены данных новых объектов.

В следующем примере класс Taxi определяется с помощью простого конструктора. После этого с помощью оператора new создается экземпляр класса. Конструктор Taxi вызывается оператором new сразу после выделения памяти для нового объекта.

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

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

Конструктор без параметров называется конструктором по умолчанию. Конструкторы по умолчанию вызываются при создании экземпляров объекта с помощью оператора new, при этом для оператора new не указываются аргументы. Дополнительные сведения см. в разделе Конструкторы экземпляров (руководство по программированию в C#).

Компилятор C# предоставляет классам без конструкторов открытый конструктор по умолчанию, чтобы обеспечить создание экземпляров класса, если класс не является статическим. Дополнительные сведения см. в разделе Статические классы и члены статических классов (руководство по программированию в C#).

Чтобы не допустить создание экземпляров класса, можно сделать конструктор закрытым:

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

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

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

Конструкторы для типов структур похожи на конструкторы классов, но structs не могут содержать явно указанный конструктор по умолчанию, поскольку такой конструктор автоматически предоставляется компилятором. Этот конструктор инициализирует все поля в struct их значениями по умолчанию. Дополнительные сведения см. в разделе Таблица значений по умолчанию (Справочник по C#). Однако конструктор по умолчанию вызывается только в том случае, если создается экземпляр struct при помощи оператора new. Например, следующий код использует конструктор по умолчанию для Int32 таким образом, чтобы гарантировать инициализацию целочисленного значения.

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

Однако в следующем коде возникает ошибка Ошибка компилятора CS0165, поскольку оператор new не используется и поскольку в коде совершается попытка использовать объект, который не был инициализирован.

int i;
Console.WriteLine(i);

Также можно инициализировать или присваивать объекты, основанные на structs (включая все встроенные числовые типы), и затем использовать их, как показано в следующем примере.

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

Поэтому вызов конструктора по умолчанию для типа значения не требуется.

Классы и structs могут определять конструкторы, использующие параметры. Конструкторы, использующие параметры, нужно вызывать с помощью операторов new или base. Классы и structs также могут определять несколько конструкторов; они не требуются для определения конструктора по умолчанию. Пример.

public class Employee
{
    public int salary;

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

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

Этот класс можно создать с помощью любого из следующих операторов:

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

Конструктор может использовать ключевое слово base для вызова конструктора базового класса. Пример.

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

В этом примере конструктор базового класса вызывается перед выполнением блока конструктора. Ключевое слово base можно использовать как с параметрами, так и без них. Любые параметры конструктора можно указывать для оператора base или в составе выражения. Дополнительные сведения см. в разделе base (Справочник по C#).

Если конструктор базового класса не вызывается явным образом в производном классе при помощи ключевого слова base, то вызывается конструктор по умолчанию, если он существует. Это означает, что следующие объявления конструкторов действуют одинаково:

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

Если в базовом классе нет конструктора по умолчанию, производный класс должен сделать явный вызов базового конструктора при помощи ключевого слова base.

Конструктор может вызывать в том же самом объекте другой конструктор с помощью ключевого слова this. Как и base, ключевое слово this можно использовать с параметрами или без параметрами, а все параметры конструктора доступны в качестве параметров this или в составе выражения. Например, второй конструктор в предыдущем примере можно переписать с помощью this:

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

Использование ключевого слова this в предыдущем примере приводит к вызову этого конструктора:

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

Конструкторы могут быть отмечены модификаторами public (открытый), private (закрытый), protected (защищенный), internal (внутренний) или protectedinternal (защищенный внутренний). Эти модификаторы доступа определяют порядок доступа пользователей класса к конструкторам класса. Дополнительные сведения см. в разделе Модификаторы доступа.

Конструктор можно объявить статическим при помощи ключевого слова static. Статические конструкторы вызываются автоматически непосредственно перед доступом к статическим полям и обычно служат для инициализации членов статического класса. Дополнительные сведения см. в разделе Статические конструкторы.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 1.6.7.1 Конструкторы

  • 10.11 Конструкторы экземпляров (классы)

  • 11.3.8 Конструкторы (структуры)

  • 11.3.10 Статические конструкторы (структуры)

См. также

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

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

Ссылки

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

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

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