Использование конструкторов (руководство по программированию в C#)
Обновлен: Ноябрь 2007
Конструкторы — это методы классов, выполняемые при создании объекта заданного типа. Конструкторы имеют такое же имя, как и классы, и обычно инициализируют члены данных новых объектов.
В следующем примере класс 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);
Однако в следующем коде возникает ошибка Ошибка компилятора CS0165, поскольку оператор 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#:
1.6.7.1 Конструкторы
10.11 Конструкторы экземпляров (классы)
11.3.8 Конструкторы (структуры)
11.3.10 Статические конструкторы (структуры)
См. также
Основные понятия
Руководство по программированию в C#
Ссылки
Классы и структуры (Руководство по программированию в C#)