Инициализация полей

При определении класса иногда удобно присваивать полям значения в точке их объявления. Фактически присваивать полям любые литеральные значения или результаты вызовов любых методов можно до тех пор, пока эти методы не вызываются на экземпляре создаваемого объекта. Например, поля можно инициализировать возвращаемым значением статического метода того же класса.

Рассмотрим следующий пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
public class A {
private static int InitX() {
Console.WriteLine( "A.InitX()" );
return 1;
}
private static int InitY0 {
Console.WriteLine ( "A.InitY0" );
return 2;
}
private static int InitA() {
Console.WriteLine ( "A.InitA0" );
return 3;
}
private static int InitB() {
Console.WriteLine( "A.InitB()" );
return 4;
}
private int у = InitY0;
private int x = InitX ();
private static int a = InitA0;
private static int b = InitB ();
}
public class EntryPoint {
static void Main 0 {
A a = new A0;
}
}

Обратите внимание, что в коде присваиваются значения всем полям с использованием инициализаторов полей и установки полей в значения, возвращаемые вызовами методов. Все методы, вызываемые во время инициализации, статические, что позволяет подчеркнуть несколько важных моментов относительно инициализации полей. Вывод приведенного выше кода выглядит так:

A.InitA0
A.InitB0
A.InitY0
A.InitX0

Следует отметить, что два из этих полей — а и b — статические, в то время как х и у — поля экземпляра. Исполняющая система инициализирует статические поля прежде, чем тип класса используется первый раз в данном домене приложения. В следующем разделе “Статические конструкторы (класса)” будет показано, как изменить время инициализации средой CLR статических полей.

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

Иногда этот порядок может оказаться важным, если статические поля основаны на выражениях или методах, которые полагаются на то, что другие поля того же класса должны быть инициализированы раньше. Любой ценой избегайте написания подобного кода.

Фактически любой код, требующий учета порядка объявления полей, является плохим. Если последовательность инициализации существенна, следует рассмотреть возможность инициализации всех полей в теле статического конструктора.

В результате программисты, сопровождающие код впоследствии, не будут неприятно удивлены результатом изменения порядка полей в определении класса, если это понадобится по каким-то причинам.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100