Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
гавно для печати.docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
171.17 Кб
Скачать

39. Динамическая идентификация типов. Проверка типа с помощью ключевого слова is. Использование операторов as, typeof.

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

В C# динамическую идентификацию типов поддерживают 3 ключевых слова (или 3 оператора): is, as, typeof.

Оператор is записывается в виде: выражение is тип

Тип выражения сравнивается с указанным типом и сравнивается true или false. Если результат ИСТИНА, то выражение можно привести к типу.

Оператор as используется в операции приведения типов, чтобы не генерировать исключения, если попытка была неудачной : выражение as тип

Если приведение типов прошло успешно, то возвращается ссылка на тип, а иначе – нулевая ссылка.

Оператор typeof позволяет получить информацию о типе данных. Формат записи:

Typeof (тип)

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

Наборы хранят разные типы данных и для распознавания их типов элементов нужно использовать слова 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();