Динамическая идентификация типов

80

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

Для поддержки динамической идентификации типов в C# предусмотрены три ключевых слова: is, as и typeof. Каждое из этих ключевых слов рассматривается далее по очереди.

Оператор is

Конкретный тип объекта можно определить с помощью оператора is. Ниже приведена его общая форма:

выражение is тип

где выражение обозначает отдельное выражение, описывающее объект, тип которого проверяется. Если выражение имеет совместимый или такой же тип, как и проверяемый тип, то результат этой операции получается истинным, в противном случае — ложным. Так, результат будет истинным, если выражение имеет проверяемый тип в той или иной форме. В операторе is оба типа определяются как совместимые, если они одного и того же типа или если предусмотрено преобразование ссылок, упаковка или распаковка.

Ниже приведен пример применения оператора is:

using System;

namespace ConsoleApplication1
{
    class Add { }
    class Sum : Add { }

    class Program
    {
        static void Main()
        {
            Add a = new Add();
            Sum s = new Sum();

            if (a is Add)
                Console.WriteLine("Переменная a имеет тип Add");
            if (s is Sum)
                Console.WriteLine("Тип переменной s унаследован от класса Add");
            Console.ReadLine();
        }
    }
}
Пример использования ключевого слова is

Оператор as

Иногда преобразование типов требуется произвести во время выполнения, но не генерировать исключение, если исход этого преобразования окажется неудачным, что вполне возможно при приведении типов. Для этой цели служит оператор as, имеющий следующую общую форму:

выражение as тип

где выражение обозначает отдельное выражение, преобразуемое в указанный тип.

Если исход такого преобразования оказывается удачным, то возвращается ссылка на тип, а иначе — пустая ссылка. Оператор as может использоваться только для преобразования ссылок, идентичности, упаковки, распаковки. В некоторых случаях оператор as может служить удобной альтернативой оператору is. В качестве примера рассмотрим следующую программу:

using System;

namespace ConsoleApplication1
{
    class Add { }
    class Sum : Add { }

    class Program
    {
        static void Main()
        {
            Add a = new Add();
            Sum s = new Sum();

            // Выполняем приведение типов
            a = s as Add;
            if (a != null)
                Console.WriteLine("Преобразование прошло успешно");
            else
                Console.WriteLine("Ошибка при преобразовании");

            Console.ReadLine();
        }
    }
}

Результатом выполнения данной программы будет успешное преобразование.

Оператор typeof

Несмотря на всю свою полезность, операторы as и is проверяют лишь совместимость двух типов. Но зачастую требуется информация о самом типе. Для этой цели в C# предусмотрен оператор typeof. Он извлекает объект класса System.Type для заданного типа. С помощью этого объекта можно определить характеристики конкретного типа данных. Ниже приведена общая форма оператора typeof:

typeof(тип)

где тип обозначает получаемый тип. Информация, описывающая тип, инкапсулируется в возвращаемом объекте класса Type.

Пройди тесты
Лучший чат для C# программистов