Обобщение. Разработка обобщенных наборов, методов, классов

Наборы хранят разные типы данных и для распознавания их типов элементов нужно использовать слова is или as. Особенно, если применять цикл foreach. Это трудоемко. Хотелось бы создавать такие наборы, классы, просто указывая, что в них будут применяться обобщенные типы. Для этого и служит обобщение. Обобщение – типы, которые принимают имена других типов в качестве параметров.Достаточно создать набор данных обобщенного типа и настраивать его на конкретные типы.

В среде .NET Framework есть обобщение для большинства классов наборов. Их эквивалентные обобщения: ArrayList –>List <T>, Queue –> Queue <T>, Stack –> Stack <T>, HashTable

List <T> служит для создания списков объектов, поддерживающих контроль типов.

<T> - для обозначения типов (Type), <K> - для обозначения ключей (Key), <V> - для обозначения значений (Value).

Например, если нужно создать список целых чисел, то нужно объявить объект класса List, указав тип int в качестве параметра. Затем применить метод Add для добавления элементов. Просмотреть элементы можно с помощью цикла foreach, используя индексатор класса.

Разработка обобщенного метода

Разработаем обобщенный метод обмена значениями 2-х переменных. Параметры нужно передавать по ссылке ref, чтобы получить адреса переменных. Разработаем метод классе Figura.

static void Swap <T>(ref T a, ref T b)

{ Console.WriteLine(“Методу Swap передано “+typeof(T));

T x; x=a; a=b; b=x; }

// Проверим в Main():

// 1) Обмен между целыми числами:

int a=8, b=37; Figura.Swap <int> (ref a, ref b); Console.WriteLine(“Числа после обмена: ”+a+”, “+b);

// 2) Обмен между строками:

string st1=”Привет!”, st2=”Скоро сессия!”; Figura.Swap <string> (ref st1, ref st2);

Console.WriteLine(“Строки после обмена: “+st1+”, “+st2);

Разработка обобщенного класса

В проекте Планиметрия разработаем класс Vektor.

class Vektor <T>

{ private T x1, y1, x2, y2;

// Конструктор:

public Vektor (T a, Tb, Tc, T d)

{ x1=a; t1=b; x2=c; y2=d; }

// Обобщенные свойства:

public T Koord_x1

{ get {return x1;}

set {x1=value;}

}

public T Koord_y1

{ get {return y1;}

set {y1=value;}

}

// Аналогично разработать для x2 и y2.

public void Show()

{ Console.WriteLine(“Поля класса имеют тип ”+typeof(T));

Console.WriteLine(“x1=”+x1+”, y1=”+y1+”, x2=“+x2+”, y2=”+y2);

// Проверим в Main():

Vektor <int> v1=new Vektor <int> (5, 8, 0, 1);

v1.Show();

v1.Koord_x1=100;

v1.Koord_y1=200;

v1.Show();

 


41. Отражение и атрибуты. Понятие отражения. Класс System.Type. Получение информации о методах и типах. Атрибуты. Основы применения атрибутов.

Программный код в среде CLR упаковывается в сборки. Компоновочный файл (assembly) содержит информацию о развертывании приложения, ее версии. Он нужен для поддержки механизма безопасного взаимодействия компонентов, межъязыковой работоспособности. Обычно сборку отождествляют с компоновочным файлом, но фактически это логический контейнер, который содержит следующие данные: 1) метаданные сборки (манифест) – состоят из описания сборки (имя, версия, поддерживаемые языки). 2) метаданные типов – это информация описывает тип, включая пространство имен, имена классов, входящих в сборку, члены классов (конструкторы, методы, свойства) и их параметры; 3) код на промежуточном языке MSIL – он затем компилируется в двоичные машинные коды при запуске сборки; 4) ресурсы – это объекты (строки, изображения, подключаемые файлы), которые используются приложением.

Просмотреть манифест сборки можно с помощью Object Browser, а также с помощью утилиты дизассемблирования ILDasm.exe. Она позволяет просмотреть не только манифест, но и метаданные типов, инструкции IL, ресурсы.

ПУСК -> VsTools -> Promt -> ILDasm -> папка с проектом -> папка Debug -> *.exe.

Если дважды щелкнуть по нему, то попадаем в метаданные в блокноте. Обычно все компоненты находятся в одном файле. Говорят: однофайловая сборка. Этот файл имеет расширение *.dll или *.exe. Для создания многофайловых сборок, компоновочный файл связывают с другим файлом с помощью модификатора internal. Модификатор internal используется также для создания программных компонентов. Его назначение – заявить о том, что некоторый элемент известен во всех файлах, входящих в состав компоновочного файла, но не известен вне его.

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

По существу, отражение служит для представления программного кода в виде объекта. Оно позволяет запрашивать и генерировать код от целых сборок, от его модулей или от отдельных выражений. Ядром отражения является класс System.Type. Объект этого класса воспроизводит или отражает базовый тип, который он представляет. Для использования отражения и класса Type нужно включить инструкцию: using System.Reflection;. Класс Type является производным от класса System.Reflection.MemberInfo. В этом классе имеются абстрактные свойства такие, как тип класса, тип интерфейса, имя типа и др. Используя методы и свойства класса Type, можно подробно включить информацию о типе, ведь во время компиляции подключенные программные коды становятся недоступными, а отражение (класс Type) позволяет получить информацию о программных кодах.

Атрибуты.С помощью атрибутов можно вносить в программу информацию описательного характера о классе, методе и т.д. Атрибут не является членом класса. Он записывается в квадратных скобках перед каким-то элементом сборки или класса. Например, в Windows приложениях в файле Program записан атрибут [STAThread] (Single Threaded Apartament) – модель организации однопоточной обработки. Атрибуты поддерживаются классом System.Attribute. Чтобы распознать что это атрибут, их называют составным именем. Например, ErrorAttribute, AttributeUsage. Хотя атрибуты – классы, но они очень просты. Обычно содержат лишь поля и свойства.

Встроенные атрибуты. В С# имеется 3 встроенных атрибута: 1) AttributeUsage – определяет перечисление типов данных, к которым можно применить атрибут. Его можно просмотреть в Object Browser. Это такие типы как интерфейсы, свойства, методы, классы, события и т.д. 2) Conditional – позволяет создавать условные методы. Условный метод – это метод, который вызывается только в том случае, если его идентификатор определен в директиве компилятора. Обычно его применяют при распространении пробных версий приложений. 3) Obsolete[“message”] – позволяет отмечать какой-либо элемент приложения как устаревший.