Динамическая идентификация типов (RTTI) позволяет определить тип объекта во время выполнения программы. Она оказывается полезной по целому ряду причин. В частности, по ссылке на базовый класс можно довольно точно определить тип объекта, доступного по этой ссылке. Динамическая идентификация типов позволяет также проверить заранее, насколько удачным будет исход приведения типов, предотвращая исключительную ситуацию в связи с неправильным приведением типов. Кроме того, динамическая идентификация типов является главной составляющей рефлексии.
Для поддержки динамической идентификации типов в C# предусмотрены три ключевых слова: is, as и typeof. Каждое из этих ключевых слов рассматривается далее по очереди.
Проверка типа с помощью оператора is
Конкретный тип объекта можно определить с помощью оператора is. Ниже приведена его общая форма:
где
Ниже приведен пример применения оператора is.
// Продемонстрировать применение оператора is. using System;
class A {} class В : A {}
class Usels {
static void Main() {
A a = new A();
В b = new В(); if (a is A)
Console.WriteLine("а имеет тип A"); if(b is A)
Console.WriteLine ("b совместим с А, поскольку он производный от А"); if(a is В)
Console.WriteLine("Не выводится, поскольку а не производный от В");
if(b is В)
Console.WriteLine("В имеет тип В"); if(a is object)
Console.WriteLine("а имеет тип object");
}
}
Вот к какому результату приводит выполнение этого кода.
а имеет тип А
b совместим с А, поскольку он производный от А b имеет тип В а имеет тип object
Большая часть выражений i s в приведенном выше примере не требует пояснений, но два из них необходимо все же разъяснить. Прежде всего, обратите внимание на следующую строку кода.
if (b is А)
Console.WriteLine("b совместим с А, поскольку он производный от А");
Условный оператор if выполняется, поскольку b является объектом типа В, производным от типа-А. Но обратное несправедливо. Так, если в строке кода
if(a is В)
Console.WriteLine("Не выводится, поскольку а не производный от В");