Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Когда создается экземпляр структуры
В следующем примере класс с именем 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#
- конструкторы
- Финализаторы