Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

Int X; // поле объектов класса

static int y = 3; // y = x + 5; - ошибка: х – поле объекта

public static int z = 5 - y; // эквивалент: z = 5 - T.y;

}

class Program

{

static void Main()

{

// Console.WriteLine("T.y = " + T.y); // Error! T.y is private!

int z = T.z; // z и T.z - разные переменные!

Console.WriteLine("T.z = " + ++T.z); // изменяется T.z

Console.WriteLine("z = {0}", z);

}

}

Результат выполнения программы:

T.z = 3

z=2

Следует отметить одну особенность инициализации статических полей

"поле:инициализация статических полей" . Вначе они все получают умалчиваемые

значения (для арифметических типов – нулевые). Затем последовательно (сверху

вниз) выполняются инициализаторы. Тем самым, если в инициализирующее

выражение входит в качестве операнда статическое поле, которое ещё не

инициализировано явно, то для него берётся умалчиваемое (например, нулевое)

значение. В качестве примера рассмотрим программу

:

// 10_02.cs - статические поля - порядок инициализации

using System;

class T

{

public static int x = y;

static int y = 3;

public static int z = y;

}

class Program

{

static void Main()

{

Console.WriteLine("T.x = " + T.x);

Console.WriteLine("T.z = " + T.z);

}

}

Результат выполнения программы:

T.x = 0

T.z = 3

Обратите внимание, что поле y по умолчанию закрытое (имеет статус доступа

private) и обращение к нему невозможно вне класса T.

Открытые статические члены разных классов одной программы могут

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

со статическими полями, обращения к которым используются в инициализирующих

выражениях разных классов.

// 10_03.cs - статические поля разных классов

using System;

class c1 {

public static double orbit = 2 * c2.pi * c3.radius;

}

class c2 {

public static double pi = double.Parse(c3.str);

}

class c3 {

public static string str = "3,14159";

public static double radius = 10;

}

class Program

{

static void Main()

{

Console.WriteLine("c1.orbit = {0}", c1.orbit);

c3.radius = 20;

Console.WriteLine("c3.radius = {0}", c3.radius);

Console.WriteLine("c1.orbit = {0}", c1.orbit);

}

}

Результат выполнения программы:

c1.orbit = 62,8318

c3.radius = 20

c1.orbit = 62,8318

Инициализация статических полей "поле:инициализация статических полей"

выполняется только однажды. Поэтому значение поля c1.orbit не изменилось после

изменения c3.radius в методе Main( ).

10.3. Статические константы

Константы

"константы"

могут быть локализованы в теле метода, а могут

принадлежать классу. В последнем случае они по умолчанию без модификатора

static являются статическими, т.е. недоступны через ссылку на объекты класса.

Объявление статической константы

"константы:объявление статической

константы" имеет вид:

модификаторыopt const тип_константы

список_объявлений_констант

Необязательные

модификаторы

для

констант

это

при

отсутствии

наследования модификаторы доступа (public, private, protected, internal).

Объявление из списка_объявлений_констант имеет вид:

идентификатор=инициализирующее_выражение.

Идентификатор

служит

именем

статической

константы

.

В

инициализирующее выражение имеют право входить только константы–литералы

и статические константы. (Порядок их размещения в объявлении класса

безразличен.) Каждая константа должна быть обязательно явно инициализирована.

Умалчиваемые значения для статических констант не предусмотрены.

Пример с классом статических констант

:

// 10_04.cs - статические константы класса

using System;

class Constants

{

public const double скорость_света = 299793; // км/сек

public const double радиус_электрона = 2.82e-13; // см

}

class Program

{

static void Main()

{

Console.WriteLine("радиус_электрона = {0}",

Constants.радиус_электрона); }

}

Результат выполнения программы:

радиус_электрона = 2,82E-13

В отличие от статических полей константы инициализируются однажды и не

принимают до явной инициализации промежуточных умалчиваемых значений.

Поэтому последовательность размещения объявлений статических констант не

важна. Для иллюстрации этой особенности приведём следующую программу:

// 10_05.cs - статические константы разных классов

using System;

class One {

public const double circle = 2 * pi * Two.radius;

public const double pi = 3.14159;

}

class Two

{

public const double radius = 20;

}

class Program

{

static void Main()

{

Console.WriteLine("One.circle = {0}", One.circle);

}

}

Результат выполнения программы:

One.circle = 125,6636

Следует обратить внимание на отличия статических констант от статических

полей с модификатором readonly (только чтение). Статические константы

получают значения при компиляции, а статические поля (даже снабженные

модификатором readonly) инициализируются в процессе выполнения программы.

Инициализация статических полей выполняется в порядке их размещения в тексте

объявления класса, и до инициализации поле имеет умалчиваемое значение. В то же

время инициализирующие выражения статических констант вычисляются в

"рациональной"

последовательности,

независимо

от

порядка

размещения

объявлений. Эти особенности иллюстрируют объявления констант в классе One:

public const double circle = 2*pi*Two.radius;

public const double pi=3.14159;

В инициализатор константы circle входит константа pi, объявление которой

следует за объявлением circle. Несмотря на это, значением circle будет 125,6636.

Конечно, при инициализации нескольких констант недопустимо появление

"зацикливания". В инициализатор константы K1 не должна входить константа K2, в

инициализатор которой входит константа K1.

Указанное

"зацикливание"

никогда

не

возникает

при

инициализации

статических полей (даже имеющих модификатор readonly). Поле F2, объявление

которого размещено ниже, может входить в инициализатор поля F1 – оно имеет

там умалчиваемое значение. При этом поле F1, использованное в инициализатор F2,

будет иметь там уже конкретное значение. Замена const на static readonly в

предыдущем примере:

public static readonly double circle = 2*pi*Two.radius;

public static readonly double pi=3.14159;

При такой инициализации значение circle будет 0.

Соседние файлы в папке CSBasicCourse2ndedPodbelsky