Использование конструкторов (Руководство по программированию на 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#)