Эти категории типов-ссылок и типов-значений заслуживают первоочередного внимания. Классы и структуры являются программно-определяемыми типами, которые позволяют определять (создавать) новые типы, специально приспособленные для решения конкретных задач. В рамках объявления класса и структуры описывается множество переменных различных типов (набор данных-членов класса), правила порождения объектов-представителей структур и классов, их основные свойства и методы, применение которых обеспечивает решение задачи.
В программе класс объявляется с помощью специальной синтаксической конструкции, которая называется объявлением класса. Фактически, объявление структур и классов является основным элементом любой C# программы. В программе нет ничего, кроме их объявлений и конструкций, облегчающих процедуру этого объявления.
С точки зрения синтаксиса, между объявлениями классов и структур существует незначительные различия (ключевое слово struct и class, в структуре не допускается объявлений членов класса со спецификаторами доступа protected, protected internal, особенности объявления конструкторов – не допускается объявления конструктора без параметров), часть из которых будет обсуждаться далее.
В этом разделе обсуждаются основные правила объявления классов.
Объявление класса состоит из нескольких элементов:
§ объявление атрибутов - необязательный элемент объявления,
§ модификаторы прав доступа - необязательный элемент объявления,
§ class (struct для структуры),
§ имя класса,
§ имена предков (класса и интерфейсов) - необязательный элемент объявления,
§ тело класса (структуры).
Атрибуты – являются средство добавления ДЕКЛАРАТИВНОЙ (вспомогательной) информации к элементам программного кода. Назначение атрибутов: организация взаимодействия между программными модулями, дополнительная информация об условиях выполнения кода, управление сериализацией (правила сохранения информации), отладка, многое другое.
Модификаторы прав доступа – средство реализации принципа инкапсуляции, используются при объявлении классов, структур и их составляющих компонентов. Представлены следующими значениями:
Public
обозначение для общедоступных членов класса. К ним можно обратиться из любого метода любого класса программы.
Protected
обозначение для членов класса, доступных в рамках объявляемого класса и из методов производных классов.
Internal
обозначение для членов класса, доступных из методов классов, объявляемых в рамках сборки, содержащей объявление данного класса.
protected internal
обозначение для членов класса, доступных в рамках объявляемого класса и из методов производных классов, а также доступных из методов классов, объявляемых в рамках сборки, содержащей объявление данного класса.
Private
обозначение для членов класса, доступных в рамках объявляемого класса.
Сочетание ключевого слова class и имя объявляемого класса задаёт имя объявляемого типа как класса (struct ИМЯ задаёт имя структуры).
конструкции
:имя класса
:список имён интерфейсов
:имя класса, список имён интерфейсов
с обязательным разделителем ‘:’ обеспечивают реализацию принципа наследования и будут обсуждаться позже.
Тело класса в объявлении ограничивается парой разделителей ‘{‘, ‘}’, между которыми располагаются объявления данных-членов и методов класса.
Следующий пример является демонстрирует использование основных элементов объявления структуры. При объявлении класса допускается лишь один спецификатор – public (здесь он опущен). Отсутствие спецификаторов доступа в объявлениях членов структуры (класса) эквивалентно явному указанию спецификаторов private.
// Указание на используемые пространства имён.
using System;
using System.Drawing;
namespace qwe // Объявление собственного пространства имён. Начало.
{
// Начало объявления структуры
struct S1
{// Тело структуры - НАЧАЛО
// Объявление данных-членов.
private Point p;
// protected int qwe; // Спецификатор protected в объявлении членов
// структуры недопустим.
// Структура не может иметь конструктора без параметров.
public S1(int x, int y)
{
p = new Point(10,10);
}
// Объявление методов.
// Статический метод. Точка входа.
static void Main(string[] args)
{
// Тело метода. Здесь обычно располагается программный код,
// определяющий функциональность класса.
}
}// Тело структуры - КОНЕЦ
} // Объявление собственного пространства имён. Конец.