Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

2.3. Общая система типов cts Общая система типов cts

1. Общая система типов cts

В каждой конкретной сборке может содержаться любое количество различающихся типов. В мире .NET «тип» представляет собой просто общий термин, который применяется для обозначения любого элемента из множества (класс, интерфейс, структура, перечисление, делегат). При построении решений с помощью любого языка .NET, скорее всего, придется взаимодействовать со многими из этих типов. Например, в сборке может содержаться один класс, реализующий определенное количество интерфейсов, метод одного из которых может принимать в качестве входного параметра перечисление, а возвращать структуру.

CTS (Common Type Systemобщая система типов) представляет собой формальную спецификацию, в которой описано то, как должны быть определены типы для того, чтобы они могли обслуживаться в CLR-среде. Внутренние детали CTS обычно интересуют только тех, кто занимается разработкой инструментов и/или компиляторов для платформы .NET. Т.е. CTS описывает не просто примитивные типы данных, а целую развитую иерархию типов, включающую хорошо определенные точки, в которых код может определять свои собственные типы. Иерархическая структура общей системы типов (CTS) отражает объектно-ориентированную методологию одиночного наследования IL и показана на следующей схеме:

Рис. 1. 1. Общая система типов

Абсолютно всем .NET-программистам важно уметь работать на предпочитаемом ими языке с пятью типами из CTS. Краткий обзор этих типов приведен ниже:

1. Типы классов.

В каждом совместимом с .NET языке поддерживается, как минимум, понятие типа класса (class type), которое играет центральную роль в объектно-ориентированном программировании. Каждый класс может включать в себя любое количество членов(таких как конструкторы, свойства, методы и события) и точек данных (полей). В С# классы объявляются с помощью ключевого слова class:

class mySum

{

public int Sum(int x, int y)

{

return x + y;

}

}

Рассмотрим основные характеристики классов CTS:

Характеристика классов

Описание

Запечатанные

Запечатанные (sealed), или герметизированные, классы не могут выступать в роли базовых для других классов, т.е. не допускают наследования

Реализующие интерфейсы

Интерфейсом (interface) называется коллекция абстрактных членов, которые обеспечивают возможность взаимодействия между объектом и пользователем этого объекта. CTS позволяет реализовать в классе любое количество интерфейсов

Абстрактные или конкретные

Экземпляры абстрактных (abstract) классов не могут создаваться напрямую, и предназначены для определения общих аспектов поведения для производных типов. Экземпляры же конкретных (concrete) классов могут создаваться напрямую

Степень видимости

Каждый класс должен конфигурироваться с атрибутом видимости (visibility). По сути, этот атрибут указывает, должен ли класс быть доступным для использования внешним сборкам или только изнутри определяющей сборки

2. Типы интерфейсов.

Интерфейсы представляют собой не более чем просто именованную коллекцию определений абстрактных членов, которые могут поддерживаться (т.е. реализоваться) в данном классе или структуре. В С# типы интерфейсов определяются с помощью ключевого слова interface, как показано ниже:

// Объявление интерфейса в C#

public interface ICommandSource

{

void CommandParameter();

}

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

3. Типы структур.

Понятие структуры тоже сформулировано в CTS. Тем, кому приходилось работать с языком С, будет приятно узнать, что таким пользовательским типам удалось «выжить» в мире .NET (хотя на внутреннем уровне они и ведут себя несколько иначе). Попросту говоря, структура может считаться «облегчённым» типом класса с основанной на использовании значений семантикой. Обычно структуры лучше всего подходят для моделирования геометрических и математических данных, и в С# они создаются с помощью ключевого слова struct:

// Тип структуры в C#

struct Rectangle

{

// В структурах могут содержаться поля, конструкторы и определяться методы

public string recFill;

public void MyBackground()

{

Console.WriteLine("Фон элемента: " + recFill);

}

}

4. Типы перечислений.

Перечисления (enumeration) представляют собой удобную программную конструкцию, которая позволяет группировать данные в пары «имя-значение». Например, предположим, что требуется создать приложение видеоигры, в котором игроку бы позволялось выбирать персонажа одной из трех следующих категорий: «Wizard» (маг), «Fighter» (воин) или «Thief» (вор). Вместо того чтобы использовать и отслеживать числовые значения для каждого варианта, в этом случае гораздо удобнее создать соответствующее перечисление с помощью ключевого слова enum:

// Тип перечисления С#.

public enum CharacterType

{

Wizard = 100,

Fighter = 200,

Thief = 300

}

По умолчанию для хранения каждого элемента выделяется блок памяти, соответствующий 32-битному целому, однако при необходимости (например, при программировании с расчетом на устройства, обладающие малыми объемами памяти, вроде мобильных устройств на Windows Phone 7 и более старых Windows Mobile 6.x и ниже) это значение можно изменить. Кроме того, в CTS необходимо, чтобы перечисляемые типы наследовались от общего базового класса System.Enum. В этом базовом классе присутствует ряд весьма интересных членов, которые позволяют извлекать, манипулировать и преобразовывать базовые пары «имя-значение» программным образом.

5. Типы делегатов.

Делегаты (delegate) являются .NET-эквивалентом безопасных в отношении типов указателей функций в стиле С. Главное отличие заключается в том, что делегат в.NET представляет собой класс, который наследуется от System.MulticastDelegate, а не просто указатель на какой-то конкретный адрес в памяти. В С# делегаты объявляются с помощью ключевого слова delegate.

Делегаты очень удобны, когда требуется обеспечить одну сущность возможностью перенаправлять вызов другой сущности и образовывать основу для архитектуры обработки событий .NET. Делегаты обладают внутренней поддержкой для групповой адресации (т.е. пересылки запроса сразу множеству получателей) и асинхронного вызова методов (т.е. вызова методов во вторичном потоке).