Использование конструкторов (руководство по программированию на C#)
Когда создается экземпляр структуры
В следующем примере класс с именем Taxi
определяется с помощью простого конструктора. Затем этот класс создается с помощью оператора new
. Среда выполнения вызывает конструктор Taxi
сразу после выделения памяти для нового объекта.
public class Taxi
{
private string taxiTag;
public Taxi(string tag) => taxiTag = tag;
public override string ToString() => $"Taxi: {taxiTag}";
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi("Tag1345");
Console.WriteLine(t);
}
}
Конструктор, который не принимает параметров, вызывается конструктор без параметров. Среда выполнения вызывает конструктор без параметров, если объект создается с помощью оператора new
, а аргументы не предоставляются для new
. В C# 12 появились первичные конструкторы. Основной конструктор задает параметры, которые необходимо предоставить для инициализации нового объекта. Дополнительные сведения см. в конструкторах экземпляров.
Если класс не статический, классы без конструкторов получают открытый конструктор без параметров от компилятора C#, для создания экземпляра класса. Дополнительные сведения см. в Статические классы и статические члены классов.
Вы можете предотвратить создание экземпляра класса, сделав конструктор закрытым, как показано ниже.
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = Math.E; //2.71828...
}
Дополнительные сведения см. в разделе «Частные конструкторы».
Конструкторы для структур типа напоминают конструкторы классов. При создании экземпляра типа структуры с new
среда выполнения вызывает конструктор. Если для struct
задано значение default
, среда выполнения инициализирует всю память в структуре до 0. Если вы объявляете любые инициализаторы полей в типе struct
, необходимо указать конструктор без параметров. Дополнительные сведения см. в разделе Инициализация структуры и значения по умолчанию статьи типов структуры .
Следующий код использует конструктор без параметров для Int32, чтобы убедиться, что целое число инициализировано:
int i = new int();
Console.WriteLine(i);
Однако следующий код вызывает ошибку компилятора, так как он не использует new
, и потому что он пытается использовать объект, который не инициализирован:
int i;
Console.WriteLine(i);
Кроме того, некоторые struct
типы (включая все встроенные числовые типы) можно инициализировать или назначать, а затем использовать в следующем примере:
int a = 44; // Initialize the value type...
int b;
b = 33; // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);
Классы и структуры могут определять конструкторы, которые принимают параметры, включая первичные конструкторы. Конструкторы, которые принимают параметры, должны вызываться через инструкцию new
или базовую инструкцию . Классы и структуры также могут определять несколько конструкторов, и ни те, ни другие не обязаны определять конструктор без параметров. Например:
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
, внутренних, защищенных внутренних или private protected
. Эти модификаторы доступа определяют, как пользователи класса могут создавать класс. Дополнительные сведения см. о модификаторах доступа.
Конструктор можно объявить статическим с помощью ключевого слова static
. Статические конструкторы вызываются автоматически перед доступом к любым статическим полям и используются для инициализации элементов статического класса. Дополнительные сведения см. в статические конструкторы.
Спецификация языка C#
Дополнительные сведения см. в разделе «Конструкторы экземпляров» и разделе «Статические конструкторы» в спецификации языка C#. Спецификация языка является окончательным источником для синтаксиса И использования C#.
См. также
- система типов C#
- конструкторы
- Финализаторы