Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Когда создается экземпляр структуры
В следующем примере класс с именем 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#
- конструкторы
- Финализаторы