Использование конструкторов (Руководство по программированию на 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# 12 представлены основные конструкторы. Основной конструктор задает параметры, которые необходимо предоставить для инициализации нового объекта. Дополнительные сведения см. в разделе Конструкторы экземпляров.
Если класс не является статическим, компилятор C# выделяет классам без конструкторов открытый конструктор без параметров, позволяющий создавать экземпляры классов. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Создание экземпляров класса можно запретить, сделав конструктор закрытым, следующим образом:
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Дополнительные сведения см. в разделе Закрытые конструкторы.
Конструкторы для типов структур похожи на конструкторы классов. При создании экземпляра new
типа структуры вызывается конструктор. struct
Если задано значение, default
среда выполнения инициализирует всю память в структуре до 0. До C# 10 не может содержать явный конструктор без параметров, structs
так как он предоставляется компилятором автоматически. Дополнительные сведения см. в разделе инициализации структуры и значенийпо умолчанию статьи "Типы структур".
В следующем коде используется конструктор 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);
Классы и структуры могут определять конструкторы, которые принимают параметры, включая первичные конструкторы. Конструкторы, принимающие параметры, необходимо вызывать с помощью оператора new
или base. Классы и структуры также могут определять несколько конструкторов, и для определения конструктора без параметров не требуется. Например:
public class Employee
{
public int Salary;
public Employee() { }
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
ключевое слово, конструктор без параметров, если есть один, вызывается неявно. Следующие объявления конструктора фактически одинаковы:
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, protected internal или private protected. Эти модификаторы доступа определяют, каким образом пользователи класса смогут создавать класс. Дополнительные сведения см. в статье Модификаторы доступа.
Конструктор можно объявить статическим, используя ключевое слово static. Статические конструкторы вызываются автоматически, непосредственно перед доступом к любым статическим полям и используются для инициализации элементов статического класса. Дополнительные сведения см. в разделе Статические конструкторы.
Спецификация языка C#
Дополнительные сведения см. в разделах Конструкторы экземпляров и Статические конструкторы в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.