10.5. Статический конструктор
Назначение статического конструктора - инициализация статических полей класса. Статический конструктор вызывается средой исполнения приложений (CLR) перед первым обращением к любому статическому полю класса или перед первым созданием экземпляра класса.
Конструкторы классов - статические и нестатические (последние рассмотрены в главе 11) обладают рядом особенностей, отличающих их отдругих методов классов. Имя конструктора всегда совпадает с именем того класса, которому он принадлежит. Для конструктора не указывается тип возвращаемого значения (даже тип void для конструктора запрещён). В теле конструктора нет необходимости, но допустимо, использовать оператор return. Для статического конструктора нельзя использовать модификаторы доступа.
Класс может иметь только один статический конструктор. Для статического конструктора параметры не указываются - спецификация параметров должна быть пустой.
Формат объявления статического конструктора:
static имя_класса()
{операторы_ тела_конструктора }
Статический конструктор невозможно вызвать непосредственно из программы - статический конструктор вызывается только автоматически. Следует обратить внимание, что статический конструктор вызывается после выполнения инициализаторов статических полей класса. Основное назначение статического конструктора - выполнять более сложные действия, нежели инициализаторы полей и констант. Для статического конструктора недоступны нестатические члены класса.
В качестве примера определим статический конструктор того класса, в котором размещён метод Main(). В том же классе определим несколько статических полей и выполним их инициализацию как с помощью инициализаторов, так и с применением статического конструктора.
// 10_08.cs - Инициализаторы и статический конструктор
class Lekc10_08
{
static int[] ar = new int[] { 10, 20, 30, 40 };
static int numb = n + ar[3] - ar[1];
// Статический конструктор:
static Lekc10_08()
{
numb /= n;
n = ar[1] + n;
}
static int n = 2;
public static void Main()
{
Console.WriteLine("numb = {0}, n = {1}", numb, n);
}
}
Результат выполнения программы:
numb = 10, n = 22
В классе определены статические поля: ссылка аr, связанная с целочисленным массивом из 4-х элементов; целочисленные переменные numb и n. В теле статического конструктора переменным numb и n присваиваются значения, отличные от тех, которые они получили при инициализации. Текст программы и результаты её выполнения иллюстрируют следующие правила, большинство из которых мы уже приводили.
Инициализация статических полей выполняется последовательно (сверху - вниз) по тексту определения класса. Поля, для которых инициализация ещёне выполнена, имеют умалчиваемые значения. (Для арифметических типов умалчиваемое значение статического поля равно нулю.) В инициализирующих выражениях статических полей допустимо использовать обращения к другим статическим членам классов. После выполнения инициализации статических полей выполняется статический конструктор, действия которого могут изменить значения статических полей.
