
Глава 10. Класс как контейнер статических членов
10.1. Статические члены класса
Мы уже отмечали, что класс в общем случае представляет собой "трафарет" для создания объектов (этого класса) и "оболочку", в которую заключены статические члены (например, поля и методы). Остановимся подробнее на второй из названных ролей класса - рассмотрим класс как совокупность статических членов. При этом обратим внимание читателя, что в программе кроме класса, включающего метод Main(), может присутствовать любое число других классов. В этой главе будем определять классы с помощью объявлений такого формата:
class имя_класса
тело_класса
Здесь class служебное (ключевое) слово; имя_класса - идентификатор, выбранный программистом в качестве имени класса; тело_класса -заключенная в фигурные скобки последовательность объявлений (деклараций) статических членов класса. (Сразу же отметим, что статический характер членов класса это совсем необязательная их особенность, а ограничение, которого мы будем придерживаться в этой главе.)
Имеется две разных возможности определить член класса как статический. С помощью модификатора static объявляются статические:
поле (field);
метод (method);
свойство (property);
событие (event);
операция (operator);
конструктор (constractor).
Кроме того, без модификатора static по умолчанию объявляются как статистические члены класса:
константы;
локализованные в классе типы (например, вложенные классы).
Для целей данной главы ограничимся статическими полями, статическими методами, статическими конструкторами и статическими константами. Статические методы, которые мы подробно рассмотрели в предыдущей главе, будем считать хорошо знакомыми.
При объявлении члена класса он может быть снабжён одним или несколькими модификаторами. В этой главе нам полезно познакомиться со следующими: static, public, protected, internal, private, readonly, volatile. Модификатор static мы уже назвали. Применялся в предыдущих программах и модификатор public. Его назначение - сделать член класса доступным из вне объявления класса. Имеются и другие возможности влиять на доступность членов класса. Проще всего объяснить правила доступа к членам классов, рассмотрев вначале список модификаторов доступа: public - доступен без ограничений всем методам всех
(открытый) сборок;
protected - доступен в классе и в любом классе, производном
(защищещённый) от данного;
internal - доступен везде в пределах сборки;
(внутренний)
protected доступен в пределах сборки, в пределах класса и в
internal - любом классе, производном от данного;
(защищенный внутренний)
private - доступен только в классе и вложенных в него
(закрытый) типах (классах).
В объяснении модификаторов доступа нам впервые встречается термин "сборка" (assembly). В Стандарте С# [2] сборка определяется как совокупность из одного или нескольких файлов, которые создаёт компилятор как результат компиляции программы. В зависимости от того, какие средства и режимы компиляции выбраны, можно создать однофайловую или многофайловую сборку. Сборка позволяет рассматривать группу файлов как единую сущность. Сейчас достаточно, чтобы читатель знал о существовании такого понятия.
Каждый член класса может быть снабжен одним и только одним модификатором доступа. По умолчанию (при отсутствии модификатора) члену приписывается статус доступа private, то есть член класса недоступен вне класса, где он объявлен.
Для обращения к статистическому члену класса используется квалифицированное имя:
имя__ класса.имя_ члена
Так как мы уже использовали статические члены библиотечных классов, например, Math.PI и Console.WriteLine(), то нам уже знаком этот синтаксис.
Внутри класса, которому принадлежит статический член, разрешено использовать имя члена без указания имени класса.
Внимание: никакие операторы, отличные от объявлений, в классе недопустимы!