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


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

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

В следующем примере класс 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);

Однако в следующем коде возникает ошибка компилятора, поскольку оператор 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#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

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

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

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

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

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