Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЛИПО .doc
Скачиваний:
0
Добавлен:
06.12.2018
Размер:
441.86 Кб
Скачать

Закрытые конструкторы экземпляра

Чтобы сделать конструктор экземпляра закрытым, достаточно заменить ключевое слово public (используемое в предыдущих примерах) на private. Закрытый конструктор можно вызвать только из класса. Этим свойством обладают также методы и перемен­ные экземпляра, объявленные private. Закрытый конструктор экземпляра нельзя исполь­зовать для создания объектов, поэтому класс, содержащий только такой конструктор, предотвращает создание своих объектов извне класса. Этот подход часто используется для защиты классов, содержащих только статические члены (объекты которых не долж­ны создаваться) от случайного создания их экземпляров.

Статические конструкторы

В противоположность конструкторам экземпляра конструктор, объявленный static, не может быть вызван в исходном коде программы явно. Он автоматически вызывается средой исполнения в промежутке между запуском программы и порождением первого объекта класса. Статический конструктор объявляется с помощью ключевого слова static перед именем класса и пустых круглых скобок после него (см. синтаксический блок 13.3). Операторы расположены в блоке после заголовка.

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

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

Рассмотрим соответствующий синтаксический блок.

static <идентификатор_конструктора> ( )

{

<Операторы>

}

Примечания

• <Идентификатор_конструктора> должен совпадать с именем его класса.

• Конструктор static не имеет аргументов.

• Конструктор static не имеет спецификаторов доступности.

Пример:

class Account

{

private static decimal balance;

static Account()

{

balance = 0;

}

}

Конструкторы структур

Можно объявлять конструкторы структур точно так же, как это делается для классов за исключением того, что не разрешается определять конструкторы без параметров. Это может показаться бессмысленным, но причина скрыта в реализации исполняющей системы .NET. Бывают некоторые редкие случаи, когда .NET не в состоянии вызвать определенный вами конструктор без параметров. Microsoft пошли по пути наименьшего сопротивления, запретив пользовательские конструкторы без параметров для структур в С#. Таким образом, конструктор по умолчанию, который инициализирует все поля нулевыми значениями, всегда присутствует неявно, даже если применяете другие конструкторы с параметрами. Также невозможно обойти конструктор, по умолчанию определяя начальные значения полей.

Член со спецификатором readonly

Как и константы (определяемые с ключевым словом const), элементы readonly ис­пользуются для представления неизменяемых значений. Но, тогда как константе значе­ние должно быть присвоено в исходном коде, например:

const decimal pi=3.14;

значение элемента readonly может быть и неизвестно во время исполнения программы. Оно инициализируется конструктором и после этого не может быть изменено. Таким образом, константа неизменна во время исполнения программы, а элемент readonly — во все время существования объекта.

В синтаксическом блоке 13.4 показано, как объявляется член readonly. Кроме клю­чевого слова readonly общий вид объявления и значение различных его частей похожи на объявление обычной переменной экземпляра.

Объявление_ члена_readonly :=

/ <Спецификатор_ доступности> ] [static] readonly <Тип> <Идентификатор> [ = <Выражение> ];

где:

<Спецификатор_доступности>

::= private

::= public

Рассмотрим пример.

using System;

class Car

{

public readonly string CarMark;

public Car (string myCarMark)

{

CarMark = myCarMark;

}

}

class myCar

{

public static void Main()

{

Car myCar = new Car("ВАЗ-21103");

Console.WriteLine("Марка машины "

+ myCar.CarMark);

}

}