Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.5.5Инициализаторы переменных

Объявления полей могут включать инициализаторы_переменных. Для статических полей инициализаторы переменных соответствуют операторам присваивания, выполняемым во время инициализации класса. Для полей экземпляров инициализаторы переменных соответствуют операторам присваивания, выполняемым при создании экземпляра класса.

Пример.

using System;

class Test { static double x = Math.Sqrt(2.0); int i = 100; string s = "Hello";

static void Main() { Test a = new Test(); Console.WriteLine("x = {0}, i = {1}, s = {2}", x, a.i, a.s); } }

В этом примере производятся следующие выходные данные

x = 1.4142135623731, i = 100, s = Hello

так как присваивание для x происходит при выполнении инициализаторов статического поля, а присваивания для i и s происходят при выполнении инициализаторов поля экземпляра.

Инициализация значения по умолчанию, описанная в §10.5.4, происходит для всех полей, включая поля, имеющие инициализаторы переменных. Таким образом, когда класс инициализируется, все статические поля в этом классе сначала инициализируются своими значениями по умолчанию, а затем выполняются инициализаторы статических полей в текстовом порядке. Аналогично, когда создается экземпляр класса, все поля в этом экземпляре сначала инициализируются своими значениями по умолчанию, а затем выполняются инициализаторы полей экземпляров в текстовом порядке.

Статические поля с инициализаторами переменных можно наблюдать в их состоянии со значениями по умолчанию. Однако такой стиль настоятельно не рекомендуется. Пример.

using System;

class Test { static int a = b + 1; static int b = a + 1;

static void Main() { Console.WriteLine("a = {0}, b = {1}", a, b); } }

В этом примере показывается такое поведение. Несмотря на циклические определения a и b, программа допустима. Она дает на выходе

a = 1, b = 2

так как статические поля a и b инициализированы значением 0 (значение по умолчанию для int) до выполнения их инициализаторов. Когда выполняется инициализатор для a, значение b равно нулю, так что a инициализируется значением 1. Когда выполняется инициализатор для b, значение a уже равно 1, так что b инициализируется значением 2.

10.5.5.1Инициализация статического поля

Инициализаторы переменных статических полей класса соответствуют последовательности присваиваний, выполняемых в текстовом порядке, в котором они появляются в объявлении класса. Если в классе существует статический конструктор (§10.12), выполнение инициализаторов статического поля происходит непосредственно перед выполнением этого статического конструктора. Иначе инициализаторы статических полей выполняются в зависящий от реализации момент перед первым использованием статического поля этого класса. Пример:

using System;

class Test { static void Main() { Console.WriteLine("{0} {1}", B.Y, A.X); }

public static int F(string s) { Console.WriteLine(s); return 1; } }

class A { public static int X = Test.F("Init A"); }

class B { public static int Y = Test.F("Init B"); }

В этом примере на выходе может быть

Init A Init B 1 1

или

Init B Init A 1 1

так как выполнение инициализатора X и инициализатора Y могло произойти в том или другом порядке; они только должны быть выполнены до обращений к этим полям. Но в примере

using System;

class Test { static void Main() { Console.WriteLine("{0} {1}", B.Y, A.X); }

public static int F(string s) { Console.WriteLine(s); return 1; } }

class A { static A() {}

public static int X = Test.F("Init A"); }

class B { static B() {}

public static int Y = Test.F("Init B"); }

результатом должно быть:

Init B Init A 1 1

так как правила выполнения статических конструкторов (как определено в §10.12) обеспечивают, что статический конструктор для B (и следовательно инициализаторы статического поля B) должен выполняться до статического конструктора и инициализаторов поля A.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]