- •Обзор элементов класса.
- •Класс Object
- •Структуры
- •Методы Ссылочные параметры ref и out
- •Переменное число аргументов метода
- •Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами
- •Конструкторы экземпляра
- •Вызов конструктора экземпляра
- •Закрытые конструкторы экземпляра
- •Статические конструкторы
- •Конструкторы структур
- •Член со спецификатором readonly
- •Деструкторы. Сборка мусора
- •Объект Account
- •Объект Account недоступен
- •Свойства
- •Индексаторы
- •Предпосылки появления наследования
- •Синтаксис наследования.
- •Типы наследования
- •Множественное наследование
- •Наследование интерфейса
- •Виртуальные методы
- •Спецификаторы доступности
- •Вызов базовых версий функций
- •Абстрактные классы и функции
- •Структуры и наследование
- •Полиморфизм
- •Потеря и восстановление информации о типе
- •Операции is и as
- •Файловый ввод-вывод
- •Потоки данных и файловый ввод-вывод
- •Виды файлов
- •Классы файлового ввода-вывода
- •Класс FileInfo
- •Текстовый ввод-вывод при помощи Stream Reader и Stream Writer
- •Бинарный ввод и вывод при помощи класса FileStream
Закрытые конструкторы экземпляра
Чтобы сделать конструктор экземпляра закрытым, достаточно заменить ключевое слово 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);
}
}